내 소유가 아닌(즉, 수정할 권한이 없는) 모든 파일을 찾고 싶습니다. 나는 열심히 노력했다
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"
더 나은 선택이 될 것입니다.
또한보십시오: