「破損した」ファイルを見つけるには、findコマンドにifを入れ子にします。

「破損した」ファイルを見つけるには、findコマンドにifを入れ子にします。

ディレクトリ構造内の「破損した」ファイル、つまりファイルコマンドが「データ」と解釈するファイルを見つけようとします。これは私が実行しようとしましたが失敗したコマンドです。

$ 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。可能ですか?

デフォルトでは、私はその基準に一致するファイル(ファイルが特定のファイル形式を識別せずに「データ」として報告する)を見つけて、削除する前に分析できるようにリストしようとしています。

答え1

これらの構成を解釈するか、これらのパイプを実行するにはシェルが必要です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 {} +

file(あなたの質問と同じように言えば、「CORRUPT」が印刷されますdata。しかし、それが何を意味するのかわかりません。)

何をしても、{}他の人が提案したようにシェルコードに含めないでください!たとえば、名前付きファイルを$(rm -rf "$HOME")使用すると、ホームディレクトリ全体を削除できるため、これは非常に危険で移植性がありません。

答え2

タイトルに対する正確な答えではありませんが(検索にある場合は入れ子になります)、すべての目的でこれは検索に完全なシェルスクリプトを挿入するよりも優れたソリューションです。

また、ジェネリック内部では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)

注:PNG画像(または同様の画像)のテキストを一致させたい場合は、' data'==を=〜に変更してください。

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

この仮定が間違っている場合は、コメントを教えてください。

関連情報