다음 명령을 사용하여 닫는 중괄호({})와 더하기 기호(+)의 정확한 목적을 설명할 수 있습니까?
주문에서 제외되면 주문 운영이 어떻게 달라지나요?
find . -type d -exec chmod 775 {} +
답변1
중괄호는 명령의 결과로 대체되며 find
모든 chmod
명령에서 실행됩니다. 가능한 한 적은 수의 명령을 실행하려고 +
시도 합니다 (따라서 , , 의 반대). 그것들이 없으면 명령은 오류를 발생시킵니다. 다 거기 있어find
chmod 775 file1 file2 file3
chmod 755 file1
chmod 755 file2
chmod 755 file3
man find
:
-exec command ;
구현하다주문하다;반환 상태가 0이면 참입니다. 아래의 모든 매개변수
find
;
' '로 구성된 인수가 발견될 때까지 명령에 대한 인수로 처리됩니다 . 문자열 '{}
'은 일부 버전에서와 같이 개별 인수뿐만 아니라 명령 인수에 나타나는 모든 곳에서 처리되는 현재 파일 이름으로 대체됩니다.find
. …
-exec command {} +
이
-exec
작업의 변형은 선택한 파일에 대해 지정된 명령을 실행하지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 구성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. …
답변2
Tedden의 답변 외에도
- "Obviously"는 세미콜론( ) 또는 더하기 기호( )로 끝나야 합니다
-exec …
. 세미콜론은 쉘(또는 적어도 내가 사용한 모든 쉘)의 특수 문자이므로 사용하려는 경우;
+
find
명령의 일부로, 이스케이프되거나 인용되어야 합니다(\;
,";"
, 또는';'
). 를 사용하면
-exec … ;
이{}
문자열은 명령에 여러 번 나타날 수 있습니다.0을 포함, 또는 두 개 이상의 위치에 상관없이. 바라보다이것-exec
를 사용하고 싶지 않은 이유에 대한 예를 들면 , 2개 이상의 모양을 갖는 것이 유용합니다{}
. 왜냐하면 (적어도) 일부 버전에서는 단어 자체가 필요하지 않기 때문find
입니다{}
. 또는 끝입니다.find . -type f -exec mv {} {}.bak ";"
-exec … +
,{}
문자열 로~ 해야 하다앞의 마지막 매개변수로 나타납니다+
. 이와 같은 명령find . -name "*.bak" -exec mv {} backup_folder +
그 결과 알 수 없는
find: missing argument to ‘-exec’
오류 메시지가 나타납니다.cp
및 명령 과 관련된mv
해결 방법은 다음 과 같습니다.find . -name "*.bak" -exec mv -t backup_folder {} +
또는
find . -name "*.bak" -exec mv --target-directory=backup_folder {} +
단어
{}
자체는 단어여야 하며 시작이나 끝에 다른 문자를 사용할 수 없습니다. 그리고 ( 적어도) 일부 버전에서는find
.{}
지적 참고 사항: 다음과 같이 말할 수 있습니다.
찾다. -name "*.sh" -type f -executable -exec {}여기에는 선택적 매개변수가 있습니다.";"
각 스크립트를 실행합니다. 하지만
찾다. -name "*.sh" -type f -executable -exec {} +
달리다하나스크립트의 이름과 기타 모든 스크립트의 이름을 인수로 사용합니다. 이거랑 비슷한 말인데
./*.sh
쉘 명령으로서
find
결과 순서를 보장하지 않으므로 다음과 같이 실행할 수 있다는 보장은 없습니다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 실행파일 이름 프로세스가 성공하는 경우(즉, 상태 0으로 종료) 그 다음에 파일 이름 인쇄 혹시라도 혹시라도 끝 루프
그러면 "" 문자열을 포함하는 모든 파일의 이름이 인쇄됩니다
cat
. 그리고 이것은 (소문자 ) 옵션을grep
사용하여 자체적으로 수행할 수 있는 작업 이지만-l
특정 문자열을 포함하고 특정 크기를 가지며 특정 소유자가 소유한 파일을 찾는 것과 결합하는 것이L
유용할 수 있습니다. 소유자find
이며 특정 시간 범위 내에서 수정이 이루어졌습니다.그러나 이는 작동하지 않습니다
-exec … +
.-exec … +
하나의 명령이 여러 파일에 실행되므로for each file …
이를 루프 내에서 논리적 조건으로 사용하는 것은 의미가 없습니다.- 위 상황의 반대 측면은
find
잘못된 인수를 제공하거나 읽을 수 없는 디렉터리를 만나지 않는 한 일반적으로 종료 상태 0으로 종료된다는 것입니다. 실행한 프로그램이 실패하더라도(0이 아닌 종료 상태로 종료)find
종료 상태 0으로 종료됩니다. 와는 별개로 실행하는 프로그램이-exec … +
실패하면(0이 아닌 종료 상태로 종료) 0이find
아닌 종료 상태로 종료됩니다.
find(1)
백만 개의 버전을 실행 하고 find
몇 가지 시스템에서 실제로 작동하는 기능을 테스트하는 것 외에도Open Group 기본 사양 2013년 7호판find
해야 할 일, 할 수 있는 일, 하지 말아야 할 일에 대한 정보를 제공합니다.