Передача glob-выражений в функции / скрипты

Следующий сценарий должен конкатенировать несколько файлов csv в пути, указанном в первом аргументе, в один файл csv, указанный во втором аргументе

 #!/bin/zsh set -x set -v args=("$@"); globbing_pattern=${args[1]} output_file=${args[2]} # First the headers: head -n1 ${globbing_pattern}([1,1]) > $output_file # Now concatenate everything: find ${globbing_pattern} -print0 | xargs -0 cat >> $output_file 

Я хотел бы назвать этот скрипт следующим:

 my_script '/some/path/*.csv' output.csv 

но это не сработает. Я получил:

 find: /some/path/*.csv: No such file or directory 

Зачем?

2 Solutions collect form web for “Передача glob-выражений в функции / скрипты”

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

Я бы написал:

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

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

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

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

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

Или с 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).

find: /some/path/*.csv:

Найти sytanx неправильно.

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

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

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

  • Почему `zip` в цикле for работает, когда файл существует, но не тогда, когда он этого не делает?
  • ls .. не работает должным образом с символическими ссылками
  • Переход к предыдущей строке многострочной команды
  • Определение путей использования автозаполнения zsh
  • В форме `exec FD>` exec
  • перемещать файлы по шаблону с помощью zsh / zmv
  • zsh: как получить расширение файла, работающее в заявлении на печать
  • Абсолютный путь к текущему zsh?
  • Автоматическое отображение меню завершения по типу
  • Синтаксис команды повторения в zsh
  • Стандартный / канонический способ проверить, выводит ли предыдущий трубопровод выпуск?
  • Linux и Unix - лучшая ОС в мире.