find -exec에서 현재 파일을 {}로 대체하는 방법은 무엇입니까?

find -exec에서 현재 파일을 {}로 대체하는 방법은 무엇입니까?

내가 소유하지 않은(즉, 수정할 권한이 없는) 모든 파일을 찾고 싶습니다. 나는 시도했다

find . -exec if [[ ! -O {} ]]; then echo {}; fi ;

하지만 다음과 같이 전체 명령을 -exec따옴표로 묶으면 다음과 같습니다.

find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;

현재 파일에 대한 참조가 {}따옴표로 묶여 파일로 확장되지 않기 때문에 둘 다 작동하지 않습니다.

{}문제는 현재 파일을 -exec예를 들어 한 번만 find . -exec grep smf {} \;사용하는 것보다 더 복잡한 파일에 포함하는 방법을 모른다는 것입니다 . 현재 파일을 두 번 이상 참조하는 명령 찾기에서 옵션을 {}사용하는 방법은 무엇입니까 ? -exec(더 많은 시간을 사용하고 있습니다 {}).

답변1

find실행을 요청한 유틸리티 if(셸 구문의 키워드)가 존재하지 않기 때문에 코드가 작동하지 않습니다.

-O인수가 현재 사용자가 소유한 파일인 경우 테스트는 참입니다 . 동일한 테스트를 find자체적으로 수행할 수 있습니다 -user "$USER"( $USER현재 사용자로 확장한다고 가정).

find . -type f ! -user "$USER"

test -O외부 test유틸리티가 비표준 테스트를 지원하는 경우 에도 사용할 수 있습니다 (확인 man test).

find . -type f ! -exec test -O {} \; -print

-O여전히 셸 에 내장된 테스트를 사용하고 싶거나 필요하다면 테스트를 수행하기 위해 셸을 bash생성해야 합니다 .bash

find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print

bash -c이는 첫 번째 인수( )에 대해 테스트를 실행하는 발견된 각 파일에 대해 하나의 인라인 스크립트를 시작합니다 $1. 인수는 스크립트의 명령줄에서 전달됩니다 find( bash이전 문자열 은 스크립트 내부 {}에 배치되고 $0해당 쉘에서 오류 메시지에 사용됩니다). 테스트가 참이면(파일이 사용자의 소유가 아님), -print적용되고 파일의 경로 이름을 인쇄합니다.

다음을 사용하면 이 작업을 좀 더 효율적으로 수행할 수 있습니다.

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

이는 발견된 경로 이름의 일괄 처리를 스크립트에 전달하므로 더 효율적입니다 bash -c.

...하지만 사용하는 것이 -user "$USER"더 나은 선택이 될 것입니다.

또한보십시오:

관련 정보