Передающие выражения шарика к функциям/сценариям

A bash метод, с помощью специальных функций массива; вероятно, переводимый к zsh с некоторой модификацией:

image_files=(*.svg) # use your own glob expression
n=200               # number of files per command line; adjust to taste
for ((i=0; i < ${#image_files[@]}; i+=n)); do
        montage -size 256x256 "${image_files[@]:i:n}" output-"$i".png
done
4
23.05.2013, 17:08
2 ответа

zsh не разворачивает globbings в переменных, если не сказали с $~PATTERN синтаксис.

Я записал бы это:

#! /bin/sh -
head -n -- "$1"
cat -- "$@"

И используйте его как:

my-script /some/path/*.csv > output.csv

Тем путем можно все еще выполнить последующую обработку вывод сценария, и globbing сделан в оболочке пользователя. Теперь, если Вы действительно хотите, чтобы globbing был сделан сценарием, например, преодолел "слишком много args" предел или потому что Вы действительно хотите zsh globbing независимо от оболочки пользователей, и если Вы действительно хотите, чтобы сценарий записал выходной файл (например, чтобы препятствовать тому, чтобы он подходить как вход файл или не создавать он, если бы нет никакого входного файла), необходимо было бы записать это:

#! /bin/zsh -
files=(${~1?}) output=${2?}
head -n 1 -- $files[1]
printf '%s\0' $files | xargs -r0 cat -- > $output

Или с zsh zargs:

#! /bin/zsh -
files=(${~1?}) output=${2?}
head -n 1 -- $files[1]
autoload zargs
zargs --eof= -- $files '' cat -- > $output

Теперь, я не уверен, что это действительно, что Вы хотите, поскольку это означает, что "заголовок" будет отображен дважды. Также отметьте это названные файлы - может быть проблема.

Возможно, Вы на самом деле хотите (с хвостом GNU):

#! /bin/zsh -
setopt extendedglob
files=(${~1?}) output=${2?}
cat < $files[1]
autoload zargs
zargs --eof= -- $files[2,-1] '' tail -qn +2 -- > $output

(здесь использующий extendedglob, таким образом, Вы извлекаете выгоду из полного zsh globbing).

2
27.01.2020, 20:54

найдите:/some/path / *.csv:

Найдите, что sytanx является неправильным.

Для нахождения всех файлов в данном дереве папки, которые заканчиваются .csv:

find /some/path -name "*.csv"

Так, необходимо разделить местоположение и название файла.

3
27.01.2020, 20:54

Теги

Похожие вопросы