Как проверить, содержит ли файл только нули в оболочке Linux?

Как проверить, содержит ли большой файл только нулевые байты ('') в Linux с помощью команды оболочки? Я могу написать небольшую программу для этого, но это, кажется, перебор.

6 ответов


если вы используете bash, вы можете использовать read -n 1 чтобы выйти рано, если неNUL персонаж нашел:

<your_file tr -d '' | read -n 1 || echo "All zeroes."

где ты подменяешь реальное имя your_file.


если у вас есть Bash,

cmp file <(tr -dc '0' <file)

если у вас нет Bash, следующее должно быть POSIX (но я думаю, что могут быть устаревшие версии cmp которые не удобны с чтением стандартного ввода):

tr -dc '0' <file | cmp - file

возможно, более экономически, предполагая ваш grep может читать произвольные двоичные данные,

tr -d '0' <file | grep -q -m 1 ^ || echo All zeros

Я полагаю, вы могли бы настроить последний пример еще дальше с помощью dd труба для усечения любого выхода из tr после одного блока данных (в случай есть очень длинные последовательности без новых строк), или даже до одного байта. Или, может быть, просто заставить там быть новые линии.

tr -d '0' <file | tr -c '0' '\n' | grep -q -m 1 ^ || echo All zeros

"файл" /dev/zero возвращает последовательность нулевых байтов при чтении, поэтому cmp file /dev/zero должно дать по существу то, что вы хотите (сообщая первый другой байт сразу за длиной file).


он не выиграет приз за элегантность, но:

xxd -p file | grep -qEv '^(00)*$'

xxd -p печатает файл следующим образом:

23696e636c756465203c6572726e6f2e683e0a23696e636c756465203c73
7464696f2e683e0a23696e636c756465203c7374646c69622e683e0a2369
6e636c756465203c737472696e672e683e0a0a766f696420757361676528
63686172202a70726f676e616d65290a7b0a09667072696e746628737464
6572722c202255736167653a202573203c

поэтому мы grep, чтобы увидеть, есть ли строка, которая не сделана полностью из 0, что означает, что в файле есть символ, отличный от "\0". Если нет, файл полностью состоит из нулевых символов.

(сигналы кода возврата, который произошел, я предположил, что вы хотели его для сценария. Если нет, скажи мне, и я что-нибудь напишу. else)

EDIT: добавлено-E для группировки и-q для сброса вывода.


просто:

if [ -n $(tr -d '00' < file | head -c 1) ]; then
   echo a nonzero byte
fi

на tr -d удаляет все нулевые байты. Если они еще остались, то if [ -n видит непустую строку.


полностью изменил мой ответ на основе ответа здесь

попробовать

perl -0777ne'print /^\x00+$/ ? "yes" : "no"' file