복사 할 파일 이름의 문자열이 있습니다. 그러나 이러한 파일 중 일부만 존재합니다. 내 현재 스크립트는 다음과 같습니다xargs 파일이있는 경우 복사
echo $x | xargs -n 1 test -f {} && cp --target-directory=../folder/ --parents
그러나, 나는 항상 test: {}: binary operator expected
오류가 발생합니다.
어떻게하면됩니까?
복사 할 파일 이름의 문자열이 있습니다. 그러나 이러한 파일 중 일부만 존재합니다. 내 현재 스크립트는 다음과 같습니다xargs 파일이있는 경우 복사
echo $x | xargs -n 1 test -f {} && cp --target-directory=../folder/ --parents
그러나, 나는 항상 test: {}: binary operator expected
오류가 발생합니다.
어떻게하면됩니까?
당신은 파일 이름에 대한 {}
을 대체하는 xargs
에 -i
플래그를 제공해야합니다.
그러나 xargs
은 cp
에 들어가기를 기대하는 것으로 보이는데, 그렇지 않습니다. 어쩌면
echo "$x" |
xargs -i sh -c 'test -f {} && cp --target-directory=../folder/ --parents {}'
같은 시도 (또한 공지 사항 echo
와 큰 따옴표를 사용합니다. 당신이 베어 인용 부호가없는 변수 보간을 원하는 거의 상황이 있습니다.)
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 : 그냥 당신이 실행하려는 명령을 임시 스크립트를 작성 줄에.
훌륭한 솔루션을, 감사합니다. 왜 "-n 1"인수를 사용하지 않는지 궁금합니다. 내가 생각한 바에 따르면, xargs가 없으면 한 번에 여러 인자를 넣어서 test -f를 쓸모 없게 만든다. – Zulakis
'-i'와 함께,'-n 1'은 반드시 암시되어야합니다. 특히 여러 개의'{}} 자리 표시자를 사용하면'xargs'는 한 번에 두 개 이상의 파일을 전달할 수 없습니다. 또는 여러 가지 가능한 동작 중 하나를 지정하는 구문이 어리둥절하게해야합니다. – tripleee
아, 고마워. 나는 남자 xargs''이를 찾을 수 없습니다 :/ – Zulakis