найти «поврежденный» файл, вложенный в команду 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 . Возможно ли это?

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

  • Как удалить соответствующие файлы из каталога A в каталоге B в командной строке?
  • Назначение IP-адреса переменной окружения
  • поиск и увеличение значений между символом второй тильды и символом третьей тильды в каждой строке файла txt
  • извлеките файл из jar-файла и получите diff
  • Ошибка сравнения файлов - awk
  • Какой интерпретатор оболочки запускает скрипт без shebang?
  • Как получить путь, индекс строки и содержимое строки в оболочке bash?
  • Каковы режимы readline, раскладки клавиш и их привязки по умолчанию?
  • 2 Solutions collect form web for “найти «поврежденный» файл, вложенный в команду find внутри команды find”

    Вам понадобится оболочка для интерпретации тех конструкций 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 

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

    Linux и Unix - лучшая ОС в мире.