두 가지 문제가 있습니다. 파이프를 통해 파일을 인수로 전달하려고 하며 해당 파일을 sh
함수 내 변수로 사용하려고 합니다.
내 명령은 다음과 같습니다.
find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
여기서 내 라인은 " segment.something
"처럼 보이는 모든 파일을 찾아서 파이프의 오른쪽으로 전달하는 것입니다. 에서는 someFunction.sh
인수로 파일 이름이 필요합니다. 에 입력되는 파일을 가정해 보겠습니다 segment1
.
someFunction.sh
(예를 들어) 의 모든 줄을 인쇄 합니다 segment1
.
파이프의 왼쪽에서 오른쪽으로 출력을 어떻게 전달한 다음 내에서 어떻게 호출합니까 someFunction.sh
?
답변1
당신의 명령
$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
최대 4개의 someFunction.sh
쉘 스크립트 복사본이 병렬로 시작( -P 4
)되고(이전 복사본이 완료되자마자 새 복사본이 생성됨) 각 복사본은 하나의 파일 이름을 인수( -n 1
)로 가져오는 효과가 있습니다.
이는 스크립트의 각 호출이 다음과 같다는 것을 의미합니다.
sh someFunction.sh segmentsomething
스크립트 내부에서 쉘은위치 매개변수(명령줄의 인수) into $1
등 $2
( $0
일반적으로 스크립트 자체의 이름이 포함되어 있습니다). 귀하의 경우에는 $1
파일 이름이 포함되고 나머지는 비어 있습니다.
따라서 스크립트에서 다음을 수행합니다.
filename="$1"
echo "$filename"
cat "$filename"
그게 그거야. 이제 일반적으로 find
파일을 찾아 파일 이름을 전달할 때 xargs
사람들이 서로 상기시키는 이상한 파일 이름 문제가 있는데 여기서도 그 문제를 다루겠습니다.
유틸리티는 find
공백으로 구분된 파일 이름을 전달합니다. 공백이 포함된 파일 이름이 있으면 xargs
적절한 이름으로 스크립트를 호출하는 데 문제가 발생할 수 있으므로 좋지 않습니다 .
따라서 다음을 수행하는 것이 좋습니다.언제나-print0
with find
및 -0
with 를 사용하십시오 xargs
. 이는 파일 이름이 공백으로 구분되지 않고 nul
문자( \0
)로 구분됨을 의미합니다. 이렇게 하면 훨씬 더 안전해집니다.
따라서:
$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh
답변2
someFunction.sh
작업 디렉토리에 있다고 가정하면 이와 같은 것을 사용할 수 있습니다 .
find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh
-print0
및 이름 -0
에 공백이 있는 파일을 허용합니다(일반적인 문제). 내 someFunction.sh
안에는
#!/bin/bash
echo "Arg: " $1
cat $1
간단히 말해서 파일 이름을 에코한 다음 전달된 파일의 내용을 씁니다.someFunction.sh