フォルダとサブフォルダから破損したファイルのリストを取得する

フォルダとサブフォルダから破損したファイルのリストを取得する

私は次のディレクトリ構造を持っています:

folder
└── 01
    ├── test1
        └── abc.bz2
        └── asd.bz2
    ├── test2
        └── 546.bz2
        └── alsj.bz2
    ├── test3
        └── aewr.bz2
        └── hlk.bz2
    └── test4
        └── oiqw.bz2
        └── abc.bz2
└── 02
    ├── test1
    ├── test2
    ├── test3
    └── test4
└── 03
    ├── test1
    ├── test2
    ├── test3
    └── test4
.
.
└── 31

すべてのtest1..4ディレクトリには、リモートサーバーからコピーされた多数のbzipファイルが含まれています。bzip2 -t <filename.bz2>ファイルが破損しているかどうかを確認するコマンドを知っていますが、上記のフォルダ構造で破損したすべてのファイルを確認する必要があります。それでは、破損したすべてのファイルのリストを取得するためにシェルスクリプトをどのように作成しますか?私はシェルスクリプトとLinuxに初めて触れたので、助けてくれてありがとう。

答え1

ただfind使用してください-exec

find . -name '*bz2' -exec sh -c 'bzip2 -t "$0" 2>/dev/null || echo "$0 is corrupted"' {} \;

からman find

  -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command [...]

したがって、上記のコマンドはで終わるすべてのファイルを見つけ、find各ファイルでbz2小さなスクリプトを起動します。見つかった各ファイル名に置き換えられますsh{}これは最初の引数()としてスクリプト$0に渡され、スクリプトはそのスクリプトで実行され、失敗するとエラーが表示されます。すべてのエラーメッセージを削除してきれいに保ちます。shbzip -t2>/dev/null


または、シェルを使用することもできます。を使用している場合は、サブディレクトリに再帰するオプションを有効にし、bash各bzipファイルを確認します。globstar**

shopt -s globstar
for file in folder/**/*bz; do bzip2 -t "$file" || echo "$file is corrupted"; done

答え2

以下のスクリプトを使用してください。

cd folder
find -name "*.bz2" > bzipfiles
for i in `cat bzipfiles`
do
    bzip2 -t $i
    if [ $? == '0']
    then
        echo "$i file is not corrupted"
    else
        echo "$i file is corrupted"
        echo "$i" >> corruptedfile_list
    fi
done

で破損したファイルのリストを見つけますcorruptedfile_list

関連情報