Это один вкладыш является наиболее эффективным способом , чтобы найти 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% файлами nul (например, очистка):
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 --
Я не рекомендую включать пустые файлы (нулевые байты), они часто существуют для очень определенных целей .