从文件夹及其子文件夹获取损坏文件的列表

从文件夹及其子文件夹获取损坏文件的列表

我有以下目录结构

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{}它作为第一个参数 ( ) 传递$0sh脚本,该脚本将在其上运行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

相关内容