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


17

다음 명령을 사용하여 누군가 중괄호 ({})와 더하기 부호 (+)의 목적이 정확히 무엇인지 설명해 주시겠습니까?

명령에서 제외 된 명령은 어떻게 다르게 작동합니까?

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

답변:


19

중괄호는 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조치 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. …


12

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’오류 메시지가 나타납니다.

    • cpand 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는 특정 시간 범위에서 수정되었습니다.…-lLfind

    그러나이 기능은 작동하지 않습니다 -exec … +. -exec … +여러 파일에 대해 하나의 명령을 실행 하기 때문에 for each file …루프 내에서 논리 조건으로 사용하는 것은 이치에 맞지 않습니다 .

  • 위의 find단점은 잘못된 인수를 제공하지 않거나 읽을 수없는 디렉토리를 발견하지 않으면 일반적으로 종료 상태 0으로 종료한다는 것입니다. 당신이 실행하는 프로그램 (0이 아닌 종료 상태로 종료)가 실패하더라도 find0의 종료 상태로 종료됩니다  제외하고  당신이 실행하는 프로그램이있는 경우 -exec … +(0이 아닌 종료 상태로 종료) 실패, find종료됩니다 종료 상태가 0이 아닙니다.

Open Group Base Specification Issue 7, 2013 Edition 은 백만 버전의 find(1) 테스트와 find실제로 몇 가지 시스템에서 수행하는 작업을 테스트하는 것 외에도 수행 해야 할 사항과하지 말아야 할 사항에 대한 정보를 제공했습니다 .find


3
사용하는 예제 ... -exec mv {} {}.bak ...가 모든 find구현에서 예상대로 작동 하는 것은 아닙니다 . POSIX 표준 상태 {}는 항상 인식되도록 표시되어야합니다. 그렇지 않으면 문자를 변경하지 않고 그대로 유지하거나 경로 이름으로 바꿀 수 있습니다. 전자의 경우, 전체 명령은 기본적으로 마지막 파일을 제외한 모든 파일을 삭제합니다.
jlliagre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.