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

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

내 소유가 아닌(즉, 수정할 권한이 없는) 모든 파일을 찾고 싶습니다. 나는 열심히 노력했다

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

-exec그러나 전체 명령을 다음과 같이 따옴표 로 묶으면 :

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

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

{}문제는 현재 파일을 단순한 것보다 더 복잡한 것 (한 번만 사용 ) -exec에 삽입하는 방법을 모른다는 것입니다 . 명령에서 find 옵션을 사용하여 현재 파일을 여러 번 참조하는 방법은 무엇입니까 ? (즉, 더 많은 시간을 사용함 )find . -exec grep smf {} \;{}-exec{}

답변1

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

-O인수가 현재 사용자가 소유한 파일인 경우 true를 테스트합니다. 다음 명령을 사용하여 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"더 나은 선택이 될 것입니다.

또한보십시오:

관련 정보