Це один вкладиш є найбільш ефективним способом , щоб знайти 100% файли з допомогою GNU послідовності нульових find
, xargs
і grep
(припускаючи , що останній побудовано з підтримкою PCRE):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00]" --
Перевагами цього методу перед іншими наданими відповідями є:
- непрості файли включаються до пошуку.
- нечитабельні файли не передаються в grep, уникаючи
Permission denied
попереджень.
grep
перестане читати дані з файлів після знаходження будь-якого ненульового байта ( LC_ALL=C
використовується для того, щоб кожен байт інтерпретувався як символ ).
- порожні файли (нульові байти) не включаються до результатів.
- менша кількість
grep
процесів ефективно перевіряє кілька файлів.
- шляхи, що містять нові рядки або починаються з
-
, обробляються правильно.
- працює в більшості вбудованих систем, яким не вистачає Python / Perl.
Передача -Z
опції до grep
та використання xargs -r0 ...
дозволяє виконувати подальші дії у файлах зі 100% нулями (наприклад: очищення):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00]" -- |
xargs -r0 rm --
Я також рекомендую використовувати find
параметри, -P
щоб уникнути наступних посилань та -xdev
уникати переходу файлових систем (наприклад: віддалені кріплення, дерева пристроїв, прив’язувати кріплення тощо).
Для ігнорування символів кінцевих рядків повинен працювати наступний варіант (хоча я не думаю, що це така гарна ідея):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00\r\n]" --
Склавши все це разом, включаючи видалення непотрібних файлів (100% символів нуля / нового рядка), щоб запобігти їх резервній копії:
find -P . -xdev -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00\r\n]" -- |
xargs -0 rm --
Я не рекомендую включати порожні файли (нульові байти), вони часто існують для дуже конкретних цілей .