
jpg 이미지 이외의 파일이 포함된 디렉토리 목록을 인쇄 하려고 하는데 find
옵션 사용이 -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"