найти «поврежденный» файл, вложенный в команду find внутри команды find

Я пытаюсь найти «поврежденные» файлы внутри структуры каталогов, а именно файлы, которые команда файла будет интерпретировать как «данные». Вот команда, которую я пытался запустить, но не удается:

$ find . -type f -exec if [[ $(file \{} | cut -f2 -d':') == " data" ]] \; then echo " \{} is CORRUPT" \; else echo " \{} is DATA" \; fi \; find: paths must precede expression: then 

Кто-нибудь знает, что я здесь делаю неправильно?

Я понимаю, что никогда не видел, if внутри параметра -exec . Возможно ли это?

В основном, я пытаюсь найти файлы, соответствующие этим критериям (файл будет сообщать об этом как «данные», а не указывать конкретный тип файла), а затем перечислить их, чтобы я мог проанализировать перед удалением.

Вам понадобится оболочка для интерпретации тех конструкций if/then/else или запуска этих конвейеров (хотя вам здесь не нужны):

 find . -type f -exec sh -c ' for file do case $(file -b "$file") in (data) printf "%s is CORRUPT\n" "$file";; (*) printf "%s is DATA\n" "$file";; esac done' sh {} + 

(как в вашем вопросе, он печатает «CORRUPT», когда file говорит data . Я не уверен, что это то, что вы имели в виду).

Что бы вы ни делали, не включайте {} в код оболочки, как это предлагали другие! Это было бы очень опасно (и не-портативный btw), как например файл с именем $(rm -rf "$HOME") заставит вас удалить весь домашний каталог.

Не точный ответ на ваш заголовок (вложенность, если внутри поиска), но для всех целей – лучшее решение, чем вставка всего скрипта оболочки внутри поиска.

Также обратите внимание, что внутри общего sh тесты [[ не работают и [ не соответствуют шаблону в правой части = . Или используйте регулярное выражение == ~, поскольку я считаю, что вам нужно. Итак, вам понадобится оболочка bash, которая не имеет большого значения, если вы уже находитесь в оболочке bash. В любом случае, это быстрее, чем запуск новой оболочки:

 #!/bin/bash while IFS= read -rd '' file; do if [[ $(file "$file" | cut -f2 -d':') =~ " data" ]]; then printf "%s is CORRUPT\n" "$file" else printf "%s is DATA\n" "$file" fi done < <(find . -type f -print0) 

Предостережение: я изменил ваш == на a = ~, предполагая, что вы хотите ' data' текст ' data' в PNG-изображении (или что-то подобное):

 $ file TrueTable-1.png| cut -f2 -d':' PNG image data, 405 x 292, 8-bit colormap, non-interlaced 

Пожалуйста, сделайте комментарий, если это предположение неверно.