Как использовать `file |grep <string>`в команде поиска? - PullRequest
1 голос
/ 24 сентября 2019

Как бы просто и наивно это ни звучало, я борюсь с командами find и file.Я использую -exec file, потому что определенные файлы, которые мне нужно получить, не имеют имени расширения в имени файла, что исключает возможность опции -name в find.См. Мои find команду и рабочее пространство ниже:

Мой текущий код:

workspace=/PATH/
### --- Example hierarchy of where all the files needed are located recursively:
##### -----("$workspace"/ID/ID/DICOM/cat)
####### ------- 'cat' is a .dcm file, without ".dcm" in its name

PETS=`find . -type f -exec file {} \; | grep "DICOM"`

Мой текущий вывод, который выглядит как типичный вывод для find:

./PATH/ID/ID/DICOM/cat: DICOM medical imaging data (1)

По умолчанию я бы сделал это, чтобы присвоить его переменной:

PETS=($(find . -type f -exec file {} \; | grep "DICOM"))

Однако я получаю только первый экземпляр через этот вывод (когдаЕсть много других файлов DICOM, расположенных по отношению к рабочему каталогу), что почти является усеченной версией моего текущего вывода в (1)

./PATH/ID/ID/DICOM/cat: (2)

Как сделатьЯ на самом деле получаю сами файлы из (1) или (2) или из модификации моей команды find, поэтому я могу передать ее в утилиту dcmdump из dctmk Toolbox ?

1 Ответ

0 голосов
/ 25 сентября 2019

Синтаксис немного сложный, но если вы можете вызывать и 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 {} +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...