Что такое команда командной строки Linux, которая может идентифицировать такие файлы?
Насколько нам известно , find
команда (или grep
) может только соответствовать определенной строке внутри текстового файла. Но я хочу сопоставить все содержимое, то есть я хочу увидеть, какие файлы соответствуют регулярному выражению \0+
, игнорируя символы конца строки . Может быть, find . cat | grep
идиома могла бы работать, но я не знаю, как заставить grep игнорировать строки (и обрабатывать файл как двоичный).
Предыстория: каждые несколько дней, когда мой ноутбук зависает, мой раздел btrfs теряет информацию: файлы, открытые для записи, заменяют свое содержимое нулями (размер файла остается более или менее неизменным). Я использую синхронизацию и не хочу, чтобы эти поддельные файлы распространялись: мне нужен способ идентифицировать их, чтобы я мог получить их из резервной копии.
источник
-v
вариант grep: отфильтровать все файлы с байтами от 1 до 255.Ответы:
grep
Для символов ␀ вы можете использовать режим регулярных выражений Perl:Так что вы можете использовать это:
источник
GNU grep 2.5.4
. Независимо от того, что я использую--binary-files=text
или--binary-files=binary
, это даетtrue
результат для всех непустых значений данных, например."\0\0"
,"\0x\0"
,"abcd"
... Точный код я использовал:for typ in binary text ;do for dat in '\0\0' '\0x\0' 'abcd' '' ;do printf "$dat" >f; grep --binary-files=$typ -P '[^\0]' f >/dev/null && echo true || echo false; done; done
GNU grep) 2.10
. Эта более поздняя версия дает ожидаемые результаты ... так что запоздалый +1printf '\0\n\0\0\n\n' > file
илиprintf '\n' > file
для этого имеет значение.\0
и\n
символов (даже нуль либо) будет матч.Я согласен с тем, что D_Bye говорит о нахождении корня проблемы.
В любом случае, чтобы проверить, содержит ли файл только
\0
и / или\n
вы можете использоватьtr
:Который возвращает 0 для пустых / новых строк и пустых файлов.
источник
tr -d '\0\n'
решает проблему с новой строкой, которая затем оставляет проблему (?) пустых файлов, перечисленных в выводе ... Он обрабатывает каждый байт каждого файла, хотя (что может или не может быть проблемой) +1Я подозреваю, что эти файлы редки, то есть им не выделено дисковое пространство, они просто указывают размер файла (
du
сообщит 0 для них).В этом случае, с помощью GNU find, вы можете сделать это (при условии, что путь к файлу не содержит символов новой строки):
источник
du
не позволит поцарапать содержимое каждого файла в файловой системе, поэтому вся процедура не займет более 30 минут.printf %b
выше сообщает, чтоdu
бы сообщить)-size +0
чтобы-size +1
таким образом файлы нулевой длины исключены из результатов. Также файлы, содержащиеся\n
в их пути, вызовут проблемы для этой команды.-size +0
для размеров, строго превышающих 0.-size +1
будет для размеров, строго превышающих 512. Ограничение новой строки уже упоминалось.-size +1
, вы действительно правы. Я исправил свой ответ. :-)Вот небольшая программа на Python, которая может это сделать:
И в действии:
Вы можете проверить несколько файлов с помощью ФАЙНД
-exec
,xargs
ГНУparallel
и аналогичные программы. В качестве альтернативы, это напечатает имена файлов, с которыми нужно иметь дело:Имейте в виду, что если вы собираетесь передать вывод этого в другую программу, имена файлов могут содержать символы новой строки, поэтому вы должны разграничить его по-разному (соответственно, с помощью
\0
).Если у вас много файлов, было бы лучше использовать опцию для параллельной обработки, так как это читает только один файл за раз.
источник
/etc/nologin
,~/.hushlogin
,.nomedia
, ...) которые не распознали этот ответ.Найдите файлы, которые содержат только нулевые символы '\ 0' и символы новой строки '\ n'.
Параметр
q
in sed приводит к немедленному завершению поиска по каждому файлу при обнаружении в строке любого ненулевого символа.Сделать тестовые файлы
выход
источник
-print0
аргумент отсутствует,find
либоIFS=
часть испорчена. Каков был предполагаемый разделитель?Это один вкладыш является наиболее эффективным способом , чтобы найти 100% файлы с помощью GNU последовательности нулевых
find
,xargs
иgrep
(предполагая , что последний построено с поддержкой PCRE):Преимущества этого метода перед другими ответами:
Permission denied
предупреждений.grep
прекратит чтение данных из файлов после нахождения любого ненулевого байта (LC_ALL=C
используется для проверки того, что каждый байт интерпретируется как символ ).grep
процессов эффективно проверяют несколько файлов.-
, обрабатываются правильно.Передача
-Z
опцииgrep
и использованиеxargs -r0 ...
позволяет выполнять дальнейшие действия со 100% файлами nul (например, очистка):Я также рекомендую использовать
find
параметры,-P
чтобы избежать следующих символических ссылок и-xdev
избежать обхода файловых систем (например: удаленные монтирования, деревья устройств, монтирование связывания и т. Д.).Для игнорирования символа (ов) конца строки должен работать следующий вариант (хотя я не думаю, что это хорошая идея):
Собираем все вместе, включая удаление ненужных файлов (100% нуль / символы новой строки), чтобы предотвратить их резервное копирование:
Я не рекомендую включать пустые файлы (нулевые байты), они часто существуют для очень определенных целей .
источник
\0
дырой в 900 МБ) и настоящее время результатов. Если вы сделаете это таким образом, чтобы эталон был убедительным для вас, он, скорее всего, будет убедительным для всех нас-P
по умолчанию вfind
. Если вы хотите перейти по символическим ссылкам, это-L
/-follow
. Вы обнаружите, что POSIX даже не указывает эту опциюfind
(хотя POSIX и ввел эти параметры -P / -H / -L для нескольких команд).Для использования GNU sed вы можете использовать
-z
опцию, которая определяет строку как строки с нулевым символом в конце, а также сопоставляет и удаляет пустые строки следующим образом:Команда head inbetween - это просто оптимизация.
источник
питон
Отдельный файл
Определите псевдоним:
Проверь это:
Несколько файлов
Найти все двоичные файлы рекурсивно:
Чтобы найти все недвоичные файлы, измените
&&
на||
.источник