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