다음 스크립트는 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
왜?
답변1
찾기: /some/path/*.csv:
sytanx가 잘못된 것으로 나타났습니다.
특정 폴더 트리에서 .csv로 끝나는 모든 파일을 찾으려면:
find /some/path -name "*.csv"
따라서 파일의 위치와 이름을 분리해야 합니다.
답변2
zsh
변수의 와일드카드 문자는 구문에서 지시하지 않는 한 확장되지 않습니다 $~PATTERN
.
나는 다음과 같이 쓸 것입니다 :
#! /bin/sh -
head -n -- "$1"
cat -- "$@"
다음과 같이 사용하십시오.
my-script /some/path/*.csv > output.csv
이 방법으로 스크립트 출력을 사후 처리할 수 있으며 와일드카드는 사용자의 셸에서 수행됩니다. 이제, 예를 들어 "인수 너무 많음" 제한을 극복하기 위해 스크립트로 와일드카드를 수행하기를 원하거나 사용자의 쉘에 관계없이 zsh 와일드카드를 정말로 원하고 스크립트가 출력 파일을 작성하기를 원하는 경우 (예: 입력 파일이 나타날 때 실행되는 것을 방지하거나 입력 파일이 없으면 생성되지 않음) 다음을 작성해야 합니다.
#! /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 tail을 사용하여):
#! /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의 이점을 누릴 수 있습니다).