-exec
명령은 종료되어야합니다 ;
(당신이 일반적으로 입력해야하므로 \;
하거나 ';'
또는 피하기 쉘에 의해 interpretion에) +
. 차이점은을 사용 ;
하면 파일 당 한 번 명령이 호출 +
되고 모든 파일 이름이 가능한 한 적은 횟수로 호출됩니다 (일반적으로 한 번이지만 명령 행의 최대 길이가 있으므로 분할 될 수 있음) . 이 예제를보십시오 :
$ cat /tmp/echoargs
#!/bin/sh
echo $1 - $2 - $3
$ find /tmp/foo -exec /tmp/echoargs {} \;
/tmp/foo - -
/tmp/foo/one - -
/tmp/foo/two - -
$ find /tmp/foo -exec /tmp/echoargs {} +
/tmp/foo - /tmp/foo/one - /tmp/foo/two
명령에 두 가지 오류가 있습니다.
먼저을 사용 {};
하지만 ;
고유 한 매개 변수 여야합니다.
둘째, 명령은에서 끝납니다 &&
. "run find를 지정하고 성공한 경우 {};
." 라는 파일을 제거하십시오 . -exec
명령 에서 쉘을 사용하려면 다음과 같은 쉘에서 명시 적으로 실행해야합니다 -exec sh -c 'ffmpeg ... && rm'
.
그러나 bash 명령 안에 {}를 추가해서는 안되며 특수 문자가있을 때 문제가 발생합니다. 대신 다음에 추가 매개 변수를 쉘에 전달할 수 있습니다 -c command_string
(참조 man sh
).
$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)
$
첫 번째 예제에서 쉘에 의해 평가되는 것을 볼 수 있습니다 . $(rm -rf /)
:-) 라는 파일이 있다고 상상해보십시오.
(측면 참고 : -
는 필요하지 않지만 명령 후 첫 번째 변수는 variable에 할당됩니다.이 변수 $0
는 일반적으로 실행중인 프로그램의 이름을 포함하고 매개 변수로 설정하는 것이 약간 부정확하지만 아마 여기에 아무런 해를 끼치 지 않기 때문에 우리는 그것을 그냥 -
시작하고 시작합니다 $1
.)
그래서 당신의 명령은
find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;
그러나 더 좋은 방법이 있습니다. 지원을 찾으면 다음 and
과 or
같은 작업을 수행 할 수 있습니다 find -name foo -or -name bar
. 그러나 -exec
명령 과 함께 작동 하면 명령이 성공적으로 종료되면 true 로 , 그렇지 않으면 false로 평가됩니다. 이 예제를보십시오 :
$ ls
false true
$ find * -exec {} \; -and -print
true
그것은 단지 그것을 위해 한 명령이 성공적이라면 인쇄, 실행 true
하지만 대한을 false
.
따라서으로 연결된 두 개의 exec 문을 사용할 수 -and
있으며 전자가 성공적으로 실행 된 경우에만 후자를 실행합니다.