파이프를 통해 입력 파일을 인수로 전달하시겠습니까?

파이프를 통해 입력 파일을 인수로 전달하시겠습니까?

두 가지 문제가 있습니다. 파이프를 통해 파일을 인수로 전달하려고 하며 해당 파일을 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적절한 이름으로 스크립트를 호출하는 데 문제가 발생할 수 있으므로 좋지 않습니다 .

따라서 다음을 수행하는 것이 좋습니다.언제나-print0with find-0with 를 사용하십시오 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

관련 정보