
내가 찾은 항목에 대해 여러 명령을 실행하려고 하는데 어떻게 해야 합니까?
find . -exec cmd1; cmd2
작동하지 않는 것 같습니다; 대신 cmd1이 모든 파일에서 실행된 후에 cmd2를 실행합니다.
답변1
이 데모에서는 첫 번째 에 sh -c 'echo first; false'
(또는 )을 사용하겠습니다 . 그러면 일부 출력이 제공되고 선택한 종료 코드 효과도 나타납니다. 그런 다음 두 번째 항목에 사용됩니다. 현재 디렉터리에 하나의 파일이 있다고 가정합니다.true
-exec
echo second
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
이 유형의 실제 명령은 다음과 같습니다.
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
두 번째 세트에서는 이스케이프된 괄호가 두 -exec
절을 그룹화합니다. 그 -false
사이에서는 테스트 상태가 "false"로 강제되고 . 때문에 -o
다음 표현식(두 번째 -exec
)이 평가됩니다 -false
.
에서 man find
:
expr1 expr2
연속된 두 표현식은 묵시적인 "and"로 결합됩니다. expr1이 false인 경우 expr2는 평가되지 않습니다.expr1 -a expr2
expr1 expr2와 동일합니다.expr1 -o expr2
또는; expr1이 true인 경우 expr2는 평가되지 않습니다.
답변2
오류 코드로 인해 cmd1이 cmd2가 실행되는 것을 방지할 수 있는 것에 대해 중요하지 않은 경우 0
:
find . -exec cmd1 \; -exec cmd2 \;
두 명령을 항상 실행하도록 하는 신뢰할 수 있는 유일한 방법은 find
이후에 명령을 순서대로 실행할 쉘을 호출하는 것입니다.
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
답변3
cmd1 및 cmd2를 수행하는 스크립트를 작성하는 것이 마음에 들지 않으면 다음과 같습니다.
find . -exec myscript {} \;
또는
find . -exec myscript {} +
사용 \; 또는 + myscript가 한 번에 두 개 이상의 파일을 처리할 수 있는지 여부에 따라 달라집니다(파일 이름에 공백이 있으면 털이 많아집니다).
내 경험에 따르면 당신이 하고 있는 일을 대본에 넣는 것은 거의 항상 그만한 가치가 있었습니다. 한 번 해야 한다면 다시 해야 합니다.
그러나 깔끔한 트릭은 찾기를 넣는 것입니다내부에스크립트:
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
그런 다음 myscript는 작업을 위해 인수로 제공한 모든 파일에 대해 작동하지만 인수를 제공하지 않으면 현재 디렉터리에서 find를 실행한 다음 발견된 파일에서 자신을 호출합니다. 이는 find -exec가 스크립트에 정의한 쉘 함수를 호출할 수 없다는 사실을 해결합니다.
답변4
명령을 시도해 보세요:
sudo find -name "*[!0-9][1-9].txt" -exec chmod 744 * {} \; -a -exec ls -l {} \; | sort | parallel ls -l