답변:
중괄호는 find
명령 의 결과로 대체되며 chmod
각각에 실행됩니다. +
차종은 find
가능한 몇 가지 명령으로 실행하려고 (그래서, chmod 775 file1 file2 file3
반대로 chmod 755 file1
, chmod 755 file2
, chmod 755 file3
). 그것들이 없으면 명령에 오류가 발생합니다. 이것은 모두에 설명되어 있습니다 man find
:
-exec command ;
명령을 실행 ; 0 상태가 반환되면 true입니다. 다음의 모든 인수
find
는 ';
' 로 구성된 인수 가 발견 될 때까지 명령에 대한 인수로 간주 됩니다. 문자열 '{}
'은 (는) 일부 버전에서와 같이 단독 인수가 아닌 명령 인수에서 발생하는 모든 위치에서 처리되는 현재 파일 이름으로 대체됩니다find
. …
-exec command {} +
이
-exec
조치 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. …
terdon의 답변 외에도
-exec …
는 세미콜론 ( ;
) 또는 더하기 부호 ( +
) 로 끝나야 합니다. 세미콜론이 사용되는 경우, 그래서 (적어도, 모든이 내가 사용했던 쉘, 또는) 쉘에있는 특수 문자 의 일부로서 find
명령 , 그것은 도망 또는 인용 (해야한다 \;
, ";"
또는';'
).을 사용 -exec … ;
하면 {}
문자열이 임의의 위치에 0 또는 2 이상을 포함 하여 명령에 여러 번 나타날 수 있습니다 .
를 사용
하지 않고 수행하려는 이유에 대한 예는 이 내용을 참조하십시오 . -exec
{}
두 개 이상의 모습을 갖는 것은 유용 주로 때문에에 (적어도)의 일부 버전 find
은 {}
그 자체로 단어 일 필요는 없습니다; 시작 또는 끝에 다른 문자가있을 수 있습니다. 예를 들어
find . -type f -exec mv {} {}.bak ";"
을 사용 -exec … +
하면 {}
문자열 이 의 마지막 인수로 나타나야합니다 +
. 같은 명령
find . -name "*.bak" -exec mv {} backup_folder +
수수께끼의 find: missing argument to ‘-exec’
오류 메시지가 나타납니다.
cp
and mv
명령에 대한 해결 방법은 다음 과 같습니다.
find . -name "*.bak" -exec mv -t backup_folder {} +
또는
find . -name "*.bak" -exec mv --target-directory=backup_folder {} +
그 {}
자체만으로도 단어 여야합니다. 시작 또는 끝에 다른 문자를 사용할 수 없습니다. 그리고 (최소한) 일부 버전에서는을 (를) find
둘 이상 가질 수 없습니다 {}
.
온전한 메모 : 말할 수 있습니다
찾기 . -name "* .sh"-type f-실행 가능 -exec {} 선택적 인수 ";"
각 스크립트를 실행하십시오. 그러나
찾기 . -name "* .sh"-type f-실행 가능 -exec {} +
실행하는 하나의 매개 변수로 모든 다른 사람의 이름으로 스크립트의를. 이것은 말하는 것과 비슷합니다
./*.sh
쉘 명령 find
으로 결과를 정렬한다고 보장하지 않는다는 점을 제외하고 는 running과 같이 aaa.sh
(알파벳순으로 첫 번째 *.sh
파일) 실행을 보장하지 않습니다 ./*.sh
.
find
초보자에게는 완벽하게 명확하지 않은 측면은 명령 행이 사실상 언어로 된 실행 가능한 문장 이라는 것입니다. 예를 들어
find . -name "*.sh" -type f -executable -print
방법
for each file
if the file’s name matches `*.sh` (i.e., if it ends with `.sh`)
then
if it is a plain file (i.e., not a directory)
then
if it is executable (i.e., the appropriate `---x--x--x` bit is set)
then
print the file’s name
end if
end if
end if
end loop
또는 간단히
for each file
if the file’s name matches `*.sh` AND it is a plain file AND it is executable
then
print the file’s name
end if
end loop
일부 -
키워드는 실행 가능한 조치와 테스트입니다. 특히, 이것은 사실입니다 -exec … ;
; 예를 들어
find . -type f -exec grep -q cat {} ";" -print
로 번역
각 파일마다 일반 파일 인 경우 (예 : 디렉토리가 아닌) 그때 grep -q cat filename을 실행하십시오. 프로세스가 성공하면 (즉, 상태 0으로 종료) 그때 파일 이름을 인쇄 경우 종료 경우 종료 엔드 루프
문자열 " cat
"을 포함하는 모든 파일의 이름이 인쇄됩니다 . 그리고 이것은 (소문자 ) 옵션을 사용 grep
하여 자체적으로 할 수있는 작업 이지만 특정 문자열을 포함하고 특정 크기를 가지며 특정 소유자가 소유 한 파일을 찾는 데 유용 할 수 있습니다 AND는 특정 시간 범위에서 수정되었습니다.…-l
L
find
그러나이 기능은 작동하지 않습니다 -exec … +
. -exec … +
여러 파일에 대해 하나의 명령을 실행 하기 때문에 for each file …
루프 내에서 논리 조건으로 사용하는 것은 이치에 맞지 않습니다 .
find
단점은 잘못된 인수를 제공하지 않거나 읽을 수없는 디렉토리를 발견하지 않으면 일반적으로 종료 상태 0으로 종료한다는 것입니다. 당신이 실행하는 프로그램 (0이 아닌 종료 상태로 종료)가 실패하더라도
find
0의 종료 상태로 종료됩니다
제외하고 당신이 실행하는 프로그램이있는 경우 -exec … +
(0이 아닌 종료 상태로 종료) 실패,
find
종료됩니다 종료 상태가 0이 아닙니다.Open Group Base Specification Issue 7, 2013 Edition 은 백만 버전의 find(1)
테스트와 find
실제로 몇 가지 시스템에서
수행하는 작업을 테스트하는 것 외에도 수행 해야 할 사항과하지 말아야 할
사항에 대한 정보를 제공했습니다 .find
... -exec mv {} {}.bak ...
가 모든find
구현에서 예상대로 작동 하는 것은 아닙니다 . POSIX 표준 상태{}
는 항상 인식되도록 표시되어야합니다. 그렇지 않으면 문자를 변경하지 않고 그대로 유지하거나 경로 이름으로 바꿀 수 있습니다. 전자의 경우, 전체 명령은 기본적으로 마지막 파일을 제외한 모든 파일을 삭제합니다.