
Я пытаюсь распечатать 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 {} \;
Некоторые заметные отличия от ваших попыток:
{}
Между и должен быть пробел\;
- Символ
;
необходимо экранировать, поскольку это метасимвол оболочки. - Как указал @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"