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

for i in First10/*; do
     binaries/jackhmmer --tblout test$(basename $i).txt -E1 --noali $i largedatabase.fasta
done

Я не уверен в команде, которую вы выполняете в цикле. Но я думаю, что мой ответ может удовлетворить ваше требование.

Он будет создавать новый выходной файл в каждом цикле. **то есть: если у вас есть два файла с именами database1.dbи database2.dbв каталоге First10, в первом цикле будет создан вывод testdatabase1.db.txtи testdatabase2.db.txtво втором цикле.

1
06.03.2016, 18:07
2 ответа

Вам нужна оболочка, чтобы интерпретировать эти конструкции 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", когда файл говорит data . Я не уверен, что вы это имели в виду).

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

5
27.01.2020, 23:19

Это не точный ответ на ваш заголовок (вложение if внутри find), но для всех целей это лучшее решение, чем вставка целого сценария оболочки внутри find.

Также обратите внимание, что внутри общего sh тесты [[ не работают, а [ не соответствуют шаблону в правой части =. Или используйте regex ==~, как я полагаю, вам нужно. Таким образом, вам понадобится оболочка 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)

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

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

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

0
27.01.2020, 23:19

Теги

Похожие вопросы