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

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

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 

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

  • Слияние двух файлов после проверки соответствия некоторых столбцов
  • Проблемы с img2pdf и пробелы в именах файлов
  • Есть ли разница между read, head -1 и sed 1q?
  • Чтение ввода из командной строки
  • Найти и переименовать файлы, добавляющие часть пути к имени файла
  • Почему некоторые оболочки `read` builtin не могут прочитать всю строку из файла в` / proc`?
  • Как скопировать файл из удаленной сети на локальный рабочий стол
  • как разделить буферизацию на меньшие файлы csv
  • Скрипты `rm` и` rm -i`
  • Как я могу получить корневую оболочку для входа в sudo?
  • В чем смысл «$ {name ## * /}» в Shell
  • Как удалить количество строк из файла повторно
  • Interesting Posts

    Хранение одного бита информации в пользовательском пространстве

    Почему `at` предупреждает меня, что команды будут выполняться с помощью / bin / sh? Что делать, если я хочу другую оболочку?

    Запустить программу для отображения текста при запуске перед входом в систему

    Остановить DHCP от сети затопления доступными IP-адресами

    Как вызвать jq внутри awk?

    Извлечь строки из текстового файла на основе параметра в одну строку

    Заменить настройку TTL Внешние записи DNS

    Почему printf «сжимает» умлаут?

    Как читать строки с фиксированной скоростью?

    Ключ SSH не работает

    Чтение разрешений на чтение запрещено, несмотря на наличие достаточных разрешений

    Установка Linux для умственно отсталых

    Использование обратного SSH-туннелирования за один шаг вместо двух шагов (с -X)

    монитор сетевого трафика в Debian?

    Эффективность tar -xf для большого количества файлов

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