我有以下目录结构
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>
检查文件是否损坏的命令,但我需要检查上述文件夹结构中的所有损坏的文件。那么如何编写 shell 脚本来获取所有损坏文件的列表呢?我是 shell 脚本和 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
任何其他错误消息以保持干净。
或者,您可以使用 shell。如果您使用的是bash
,请启用该globstar
选项以**
递归到子目录并检查每个 bzip 文件:
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
。