Encontre arquivos 0 bytes de comprimento que consistem apenas em NUL no Debian / Ubuntu

3

Depois de fsck uma unidade ext4 que estava rodando em um QNAP nas sem um fsck por cerca de quatro anos, agora tenho um número de arquivos que parecem ser do tamanho correto (normalmente 8-12mib), mas cada byte de seu conteúdo é null / NUL / 00 (ou seja, 0 repetido várias vezes quando visto em um editor hexadecimal).

Eu verifiquei isso com a ferramenta 'hexedit', bem como amostrando vários comprimentos de bytes com 'od'

Em vez de pesquisar entre 10.000+ arquivos de imagem NEF e JPEG, existe uma maneira de eu poder automatizar a pesquisa desses arquivos e gravá-los em uma lista - para que eu possa restaurá-los a partir de um backup?

    
por inflammable 10.02.2013 / 08:16

2 respostas

2

Supondo que seus arquivos contenham APENAS a cadeia NULL (sem nova linha, \n ), você pode usar grep e localizar esses arquivos.

O comando find irá coletar todos os arquivos com pelo menos 1 byte de tamanho ( -size +1c ) no diretório atual e então usar grep para verificar se eles contêm apenas repetições do caractere NULL:

$ find . -type f -size +1c -exec grep -m 1 -ovP "[^
$ find . -type f -size +1c -exec grep -m 1 -ovP "[^
$ find . -type f -size +1c -exec grep -m 1 -ovP "[^
$ find . -type f -size +1c -exec grep -m 1 -ovP "[^%pre%]" {} \; | cut -d ' ' -f 3- | sed 's/ matches//'
./empty_file with spaces.jpg
./empty_file
]" {} \; Binary file ./empty_file with spaces.jpg matches Binary file ./empty_file matches
]" {} \; | cut -d ' ' -f 3- | sed 's/ matches//' ./empty_file with spaces.jpg ./empty_file
]" {} \; Binary file ./empty_file with spaces.jpg matches Binary file ./empty_file matches

O -v flag do grep faz com que ele imprima linhas não correspondentes. -m 1 significa "Parar após a primeira correspondência", -o significa imprimir apenas a parte da linha correspondente (evita imprimir linhas vazias de outros arquivos) e P usa expressões regulares Perl. O padrão [^NULL] significa qualquer caractere não -v . Ao inverter isso ( -m 1 ) e adicionar o NULL flag, o grep irá reportar uma correspondência somente se o arquivo não contiver nada além de cut .

Finalmente, você pode canalizar isso através de sed e %code% para imprimir o nome do arquivo correspondente sozinho:

%pre%     
por 10.02.2013 / 14:34
0

Embora a resposta acima seja muito mais detalhada (e menos complicada) em sua inspeção dos arquivos, reuniu-se o seguinte. Existem alguns comandos extras apenas para lidar com a maneira estranha em que o NAS lida com nomes de arquivos, mas ele usa 'od' para obter os primeiros 32 bytes do arquivo (meu raciocínio era que se os primeiros 32 bytes fossem nulos, então o descanso provavelmente também, especialmente para imagens):

find "$(pwd)" -type f -exec sh -c 'file=$(echo "{}" | sed "s/([\(\)])/\/g"); check=$(od -N32 -w32 -x "$file"); if echo $check | grep --quiet " 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000"; then echo "$file" $check; fi' \;

Eu tentei isso em um subconjunto das pastas que suspeito estarem corrompidas e salvei os resultados em um arquivo. Depois de verificar cada arquivo manualmente, fiquei muito feliz por ser confiável.

    
por 13.02.2013 / 09:46