찾기 작업에서 -exec 옵션을 사용하세요.

찾기 작업에서 -exec 옵션을 사용하세요.

findjpg 이미지 이외의 파일이 포함된 디렉터리 목록을 인쇄 하려고 하는데 -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"

관련 정보