Заставляем опцию -exec в find работать

Заставляем опцию -exec в find работать

Я пытаюсь распечатать 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 -execнеобходимо завершить с помощью a ;или a +. ;Команда выполняется один раз для каждого найденного имени файла, тогда как +команда выполняется один раз для всех имен файлов.

Вот рабочий пример:

find ! -iname "*.JPG" -exec dirname {} \;

Некоторые заметные отличия от ваших попыток:

  1. {}Между и должен быть пробел\;
  2. Символ ;необходимо экранировать, поскольку это метасимвол оболочки.
  3. Как указал @muru в своем ответе, -inameберет глоб, а не регулярное выражение

решение2

Пытаться:

find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u

Примечания;

  • Для завершения -execкоманды {}необходимо указать, куда следует вставить имя файла.инужна точка с запятой. Поскольку оболочка съест обычную точку с запятой, нам придется экранировать ее, чтобы она передалась в find.

  • -inameсоответствует globs, а не регулярным выражениям. Так что final $in "*.JPG$", вероятно, не то, что вам нужно.

  • Вы сказали, что вам нужен «список каталогов, содержащих файлы, отличные от jpg». Поэтому я добавил, -type fчтобы мы были уверены, что просматриваем только каталоги, содержащие хотя бы один файл.

  • Результаты подвергаются обработке sort -uдля удаления дубликатов.

решение3

Синтаксис:

-exec [command] ... {} ... ;
-exec [command] ... {} ... +

Поскольку ;это часть синтаксиса оболочки, вам нужно экранировать его, чтобы findон рассматривался как аргумент:

find .. -exec dirname {} \;

Кстати, -inameне использует регулярные выражения — просто используйте *.jpgбез $.


dirnameТеперь мне приходит в голову, что с GNU find нам вообще не нужно использовать . Вместо этого:

find ... -printf "%h\n"

Связанный контент