find
jpg 이미지 이외의 파일이 포함된 디렉터리 목록을 인쇄 하려고 하는데 -exec
해당 옵션 사용이 잘못된 것 같습니다. 내 환경은 Cygwin Bash입니다.
$ find ! -iname "*.JPG$" -exec dirname
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {}
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname;
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname ;
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {};
find: missing argument to `-exec'
답변1
A는 a 또는 a로 끝나야 합니다 -exec
. 발견된 각 파일 이름에 대해 명령이 한 번 실행되는 반면, 모든 파일 이름에 대해 명령이 한 번 실행됩니다.;
+
;
+
다음은 실제 예입니다.
find ! -iname "*.JPG" -exec dirname {} \;
귀하의 시도와는 몇 가지 주목할만한 차이점이 있습니다.
{}
사이에 공백이 있어야 합니다.\;
;
쉘 메타문자이기 때문에 이스케이프해야 합니다 .- @muru가 그의 답변에서 지적했듯이
-iname
정규식이 아닌 glob을 사용하십시오.
답변2
노력하다:
find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u
노트;
-exec
명령을 완료하려면{}
파일 이름의 위치를 표시하는 데 필요합니다.그리고세미콜론이 필요합니다. 쉘은 일반 세미콜론을 먹기 때문에 이를 에 전달하려면 이를 이스케이프 처리해야 합니다find
.-iname
정규식이 아닌 전역 변수를 일치시킵니다. 따라서 최종 결과 가 원하는 결과가 아닐$
수도 있습니다 ."*.JPG$"
"jpg 이외의 파일을 포함하는 디렉토리 목록"을 원한다고 말합니다. 그래서
-type f
최소한 하나의 파일이 포함된 디렉터리만 볼 수 있도록 이것을 추가했습니다 .중복을 제거하기 위해 결과가 전달되었습니다
sort -u
.
답변3
문법:
-exec [command] ... {} ... ;
-exec [command] ... {} ... +
이는 셸 구문의 일부 이므로 매개변수로 처리되도록 ;
이스케이프해야 합니다 .find
find .. -exec dirname {} \;
그런데, -iname
정규식을 사용하지 마세요. *.jpg
없이 그냥 사용하세요 $
.
dirname
이제 갑자기 GNU find를 사용하면 그것을 전혀 사용할 필요가 없다는 생각이 들었습니다. 대신에:
find ... -printf "%h\n"