Синтаксис немного сложный, но если вы можете вызывать и file
, и grep
из действия -exec
, то вы можете продолжить цепочку дополнительных действий без каких-либо промежуточных переменных.
способ сделать это - создать явную вложенную оболочку, содержащую конвейер file | grep
: sh -c 'file "$1" | grep -q DICOM'
."$1"
- это заполнитель проверяемого файла, поскольку сценарии оболочки принимают аргументы.(Не рекомендуется вставлять {}
в скрипт. У нас будут проблемы со специальными символами, такими как пробелы и кавычки.)
Итак, как нам установить $1
?Ответ путем добавления аргументов к команде оболочки: sh -c '<script>' arg0 arg1 arg2...
устанавливает позиционные аргументы $0
, $1
, $2
и т. Д. Для строк arg0
, arg1
, arg2
и т. Д.,Давайте сделаем это.Мы можем установить $0
в sh
, название оболочки;и $1
до {}
, имя файла от find
.
Все это действие -exec
может рассматриваться как тест, который проходит или не проходит, ничем не отличается от более простого теста, такого как -type f
,Мы можем связать другие условные действия, такие как вызов dcmdump
.
Все вместе мы получим:
find . -type f -exec sh -c 'file "$1" | grep -q DICOM' sh {} \; -exec dcmdump {} +