Este one-liner é a forma mais eficiente de encontrar 100% arquivos nul usando GNU find, xargse grep(assumindo que o último é construído com o apoio PCRE):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00]" --
As vantagens deste método sobre outras respostas fornecidas são:
- arquivos não esparsos são incluídos na pesquisa.
- arquivos não legíveis não são passados para o grep, evitando
Permission deniedavisos.
grepinterromperá a leitura dos dados dos arquivos após localizar qualquer byte diferente de nulo ( LC_ALL=Cé usado para garantir que cada byte seja interpretado como um caractere ).
- arquivos vazios (zero bytes) não são incluídos nos resultados.
- menos
grepprocessos verificam com eficiência vários arquivos.
- caminhos contendo novas linhas ou começando com
-são tratados corretamente.
- funciona na maioria dos sistemas embarcados que não possuem Python / Perl.
Passar a -Zopção para grepe usar xargs -r0 ...permite que outras ações sejam executadas nos arquivos 100% nul (por exemplo: limpeza):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00]" -- |
xargs -r0 rm --
Eu também recomendo usar as findopções -Ppara evitar seguir links simbólicos e -xdevevitar percorrer sistemas de arquivos (por exemplo: montagens remotas, árvores de dispositivos, montagens de ligação, etc).
Para ignorar o (s) caractere (s) de final de linha , a seguinte variante deve funcionar (embora eu não ache que seja uma boa ideia):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00\r\n]" --
Juntando tudo, incluindo a remoção de arquivos indesejados (100% de caracteres nul / nova linha) para impedir o backup:
find -P . -xdev -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00\r\n]" -- |
xargs -0 rm --
Eu não recomendo incluir arquivos vazios (zero bytes), eles geralmente existem para fins muito específicos .