2013-05-27 2 views
0

복사 할 파일 이름의 문자열이 있습니다. 그러나 이러한 파일 중 일부만 존재합니다. 내 현재 스크립트는 다음과 같습니다xargs 파일이있는 경우 복사

echo $x | xargs -n 1 test -f {} && cp --target-directory=../folder/ --parents 

그러나, 나는 항상 test: {}: binary operator expected 오류가 발생합니다.

어떻게하면됩니까?

답변

3

당신은 파일 이름에 대한 {}을 대체하는 xargs-i 플래그를 제공해야합니다.

그러나 xargscp에 들어가기를 기대하는 것으로 보이는데, 그렇지 않습니다. 어쩌면

echo "$x" | 
xargs -i sh -c 'test -f {} && cp --target-directory=../folder/ --parents {}' 

같은 시도 (또한 공지 사항 echo와 큰 따옴표를 사용합니다. 당신이 베어 인용 부호가없는 변수 보간을 원하는 거의 상황이 있습니다.)

+0

훌륭한 솔루션을, 감사합니다. 왜 "-n 1"인수를 사용하지 않는지 궁금합니다. 내가 생각한 바에 따르면, xargs가 없으면 한 번에 여러 인자를 넣어서 test -f를 쓸모 없게 만든다. – Zulakis

+0

'-i'와 함께,'-n 1'은 반드시 암시되어야합니다. 특히 여러 개의'{}} 자리 표시자를 사용하면'xargs'는 한 번에 두 개 이상의 파일을 전달할 수 없습니다. 또는 여러 가지 가능한 동작 중 하나를 지정하는 구문이 어리둥절하게해야합니다. – tripleee

+0

아, 고마워. 나는 남자 xargs''이를 찾을 수 없습니다 :/ – Zulakis

2

xargs는 간단한 명령을 실행할 수 있습니다. && 부분은 사용자가 원하지 않는 쉘에 의해 해석됩니다.

chmod u+x ./script.sh 
echo $x | xargs -n1 ./script.sh 

는 또한 매개 변수가 마지막 단어로 사용되기 때문에 {}-n1 필요하지 않습니다 점에 유의

cat > script.sh 
test -f "$1" && cp "$1" --target-directory=../folder/ --parents 

제어-D : 그냥 당신이 실행하려는 명령을 임시 스크립트를 작성 줄에.

관련 문제