find에서 -exec 옵션을 작동시키기

find에서 -exec 옵션을 작동시키기

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 {} \;

귀하의 시도와 몇 가지 주목할만한 차이점은 다음과 같습니다.

  1. {}와 사이에는 공백이 있어야 합니다 .\;
  2. ;(는) 쉘 메타문자이므로 이스케이프 처리해야 합니다.
  3. @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"

관련 정보