Questa one-liner è il modo più efficace per trovare i file nul 100% utilizzando GNU find
, xargs
e grep
(supponendo che quest'ultimo è costruito con il supporto PCRE):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00]" --
I vantaggi di questo metodo rispetto ad altre risposte fornite sono:
- i file non sparsi sono inclusi nella ricerca.
- i file non leggibili non vengono passati a grep, evitando
Permission denied
avvisi.
grep
interromperà la lettura dei dati dai file dopo aver trovato un byte diverso da zero ( LC_ALL=C
viene utilizzato per assicurarsi che ogni byte sia interpretato come un carattere ).
- i file vuoti (zero byte) non sono inclusi nei risultati.
- meno
grep
processi controllano in modo efficiente più file.
- i percorsi che contengono newline o che iniziano con
-
sono gestiti correttamente.
- funziona sulla maggior parte dei sistemi embedded privi di Python / Perl.
Passare l' -Z
opzione ae grep
utilizzare xargs -r0 ...
consente di eseguire ulteriori azioni sui file nul al 100% (ad esempio: cleanup):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00]" -- |
xargs -r0 rm --
Consiglio inoltre di utilizzare le find
opzioni -P
per evitare i seguenti collegamenti simbolici ed -xdev
evitare di attraversare i filesystem (ad es. Montaggi remoti, alberi dei dispositivi, montaggi di bind, ecc.).
Per ignorare i caratteri di fine riga , la seguente variante dovrebbe funzionare (anche se non penso che sia una buona idea):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00\r\n]" --
Mettendo tutto insieme, inclusa la rimozione dei file indesiderati (100% caratteri nul / newline) per impedire il backup:
find -P . -xdev -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00\r\n]" -- |
xargs -0 rm --
Non consiglio di includere file vuoti (zero byte), spesso esistono per scopi molto specifici .