Este one-liner é a forma mais eficiente de encontrar 100% arquivos nul usando GNU find
, xargs
e 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 denied
avisos.
grep
interromperá 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
grep
processos 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 -Z
opção para grep
e 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 find
opções -P
para evitar seguir links simbólicos e -xdev
evitar 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 .