To jedna wkładka jest najbardziej skutecznym sposobem na znalezienie 100% przy użyciu plików nul GNU find
, xargs
oraz grep
(zakładając, że jest ona zbudowana z obsługą PCRE):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00]" --
Zalety tej metody w porównaniu z innymi podanymi odpowiedziami to:
- pliki nieliczne są uwzględniane podczas wyszukiwania.
- nieczytelne pliki nie są przekazywane do grep, dzięki czemu można uniknąć
Permission denied
ostrzeżeń.
grep
przestanie czytać dane z plików po znalezieniu dowolnego bajtu innego niż nul ( LC_ALL=C
służy do upewnienia się, że każdy bajt jest interpretowany jako znak ).
- puste pliki (zero bajtów) nie są uwzględniane w wynikach.
- mniej
grep
procesów skutecznie sprawdza wiele plików.
- ścieżki zawierające znaki nowej linii lub rozpoczynające się od
-
są obsługiwane poprawnie.
- działa na większości systemów wbudowanych, w których brakuje języka Python / Perl.
Przekazywanie -Z
opcji grep
i używanie xargs -r0 ...
pozwala na wykonanie dalszych działań na plikach 100% NUL (np .: czyszczenie):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00]" -- |
xargs -r0 rm --
Polecam również korzystanie z find
opcji, -P
aby uniknąć następujących dowiązań symbolicznych i -xdev
aby uniknąć przechodzenia przez systemy plików (np. Zdalne montowanie, drzewa urządzeń, montowanie powiązań itp.).
Aby zignorować znaki końca linii , powinien działać następujący wariant (choć nie sądzę, że to dobry pomysł):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00\r\n]" --
Złożenie wszystkiego razem, w tym usunięcie niechcianych plików (100% znaków nul / nowej linii), aby zapobiec ich tworzeniu kopii zapasowej:
find -P . -xdev -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00\r\n]" -- |
xargs -0 rm --
Nie polecam dołączania pustych plików (zero bajtów), często istnieją one w bardzo specyficznych celach .