Obtendo lista de arquivos corrompidos da pasta e sua subpasta

1

Eu tenho a seguinte estrutura de diretórios

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

todo o diretório test1..4 contém um grande número de arquivos bzip que são copiados do servidor remoto. Eu sei o comando bzip2 -t <filename.bz2> para verificar se o arquivo está corrompido ou não, mas eu preciso verificar todos os arquivos corrompidos da estrutura de pastas acima. Então, como escrever o shell script para obter uma lista de todos os arquivos corrompidos? Eu sou novo em shell script e Linux, então qualquer ajuda seria apreciada.

    
por Rahul 19.01.2016 / 10:25

2 respostas

2

Use apenas find com -exec :

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

De 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 [...]

Portanto, o comando find acima, procurará todos os arquivos terminados em bz2 e iniciará um pequeno script sh em cada um deles. O {} é substituído por cada nome de arquivo encontrado. Isso é passado como o primeiro parâmetro ( $0 ) para o script sh , que executará bzip -t e reclamará se falhar. O 2>/dev/null descarta qualquer outra mensagem de erro para manter as coisas limpas.

Como alternativa, você pode usar o shell. Se você estiver usando bash , ative a opção globstar para tornar ** recurse em subdiretórios e verifique cada arquivo bzip:

shopt -s globstar
for file in folder/**/*bz; do bzip2 -t "$file" || echo "$file is corrupted"; done
    
por 19.01.2016 / 11:26
0

Por favor, use o script abaixo.

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

Por favor, encontre a lista de arquivos corrompidos em corruptedfile_list .

    
por 19.01.2016 / 11:01