find(1)의 -exec 옵션 이해(중괄호 및 더하기 기호)

find(1)의 -exec 옵션 이해(중괄호 및 더하기 기호)

다음 명령을 사용하여 닫는 중괄호({})와 더하기 기호(+)의 정확한 목적을 설명할 수 있습니까?

주문에서 제외되면 주문 운영이 어떻게 달라지나요?

find . -type d -exec chmod 775 {} +

답변1

중괄호는 명령의 결과로 대체되며 find모든 chmod명령에서 실행됩니다. 가능한 한 적은 수의 명령을 실행하려고 +시도 합니다 (따라서 , , 의 반대). 그것들이 없으면 명령은 오류를 발생시킵니다. 다 거기 있어findchmod 775 file1 file2 file3chmod 755 file1chmod 755 file2chmod 755 file3man 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해야 할 일, 할 수 있는 일, 하지 말아야 할 일에 대한 정보를 제공합니다.

관련 정보