Passando expressões glob para funções / scripts

4

O script a seguir deve concatenar vários arquivos csv em um caminho especificado no primeiro argumento em um único arquivo csv especificado no segundo argumento

#!/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

Eu gostaria de chamar este script com:

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

mas não funciona. Eu recebo:

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

por quê?

    
por Josh 21.05.2013 / 20:39

2 respostas

1

zsh não expande globbings em variáveis, a menos que seja informado com a sintaxe $~PATTERN .

Eu escreveria:

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

E use-o como:

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

Dessa forma, você ainda pode pós-processar a saída do seu script, e o globbing é feito no shell do usuário. Agora, se você quer que o globbing seja feito pelo script, por exemplo, para superar o limite de "muitos args" ou porque você quer um zsh globbing independentemente do shell dos usuários, e se você quer que o script escreva o arquivo de saída (por exemplo, para impedir que surja como um arquivo de entrada ou não criá-lo, se não houver arquivo de entrada), você precisaria escrevê-lo:

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

Ou com zsh ' zargs :

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

Agora, não tenho certeza de que seja realmente o que você quer, pois isso significa que o "cabeçalho" será exibido duas vezes. Observe também que arquivos chamados - podem ser um problema.

Talvez você realmente queira (com a cauda do GNU):

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

(aqui usando o extendedglob para que você se beneficie do zsh globbing completo).

    
por 22.05.2013 / 09:12
3

find: /some/path/*.csv:

Encontrar sytanx está errado.

Para localizar todos os arquivos na determinada árvore de pastas que terminam com .csv:

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

Então, você precisa separar o local e o nome do arquivo.

    
por 21.05.2013 / 21:10