私は次のディレクトリ構造を持っています:
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
に渡され、スクリプトはそのスクリプトで実行され、失敗するとエラーが表示されます。すべてのエラーメッセージを削除してきれいに保ちます。sh
bzip -t
2>/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
。