У меня есть два файла с размерами 124665 и 124858 в байтах, и я хочу проверить, является ли file1 префиксом file2 или нет.
files
file-comparison
творог
источник
источник
cmp
было бы лучше, чемdiff
здесь?cmp
что выполняет простое байтовое сравнение и возвращает, как только обнаружит разницу, аdiff
текстовая утилита собирается использовать сложный алгоритм, чтобы показать вам все различия между двумя файлами, которые вас не интересуют.Если ваша система имеет
cmp
команду из GNUdiffutils
, то одна из опцийсравнить не более первых 124665 байтов двух файлов и сообщить, отличаются ли они - или, в более общем случае,
источник
$(stat -c %s file1)
размер в байтах? Наwc
самом деле открыть и обработать весь файл, чтобы получить количество байтов?wc
реализаций оптимизирует этот случай и выполнитfstat()
(или / иlseek(SEEK_END)
), поэтому будет настолько эффективным, насколько это возможно. С другой стороны, этоstat -c
специфично для GNU.cmp
, вы можете разумно предположить специфичную для GNUstat
.GNU
cmp
может решить проблему проще:Есть четыре возможных выхода (исключая какую-то ошибку).
Нет вывода: файлы идентичны.
cmp: EOF on file1
: file1 является префиксом file2.cmp: EOF on file2
: file2 является префиксом file1.file1 file2 differ: byte NNN, line MMM
: Ни один не является префиксом другого.К сожалению, это немного неудобно для использования в скрипте, так как эти случаи, кажется, не различаются в коде выхода. Более того,
EOF on file1
сообщения отправляются в stderr, аfile1 file2 differ
сообщения - в stdout.Я предполагаю, что другие версии
cmp
делают что-то подобное, но я не проверял.источник
cmp
это не команда GNU-only и она не возникла там, она была уже в первой версии Unix в начале 70-х годов. Эта-n
опция специфична для GNU.cmp file1 file2 2>&1 | grep EOF on file1
cmp
это уникально для GNU, просто GNUcmp
была единственной версией, которую я пробовал. Я добавил предложение, чтобы уточнить.file1
а другой названfile12
. (Или, что еще хуже, что, если второй файл будет названEOF on file1
?) Решить это с помощью надежного использованияcmp
, вероятно, гораздо сложнее, чем написать очевидную 5-строчную программу на C ...cmp
очень сильно ограничены. Использование-x
опции on,grep
чтобы соответствовать всей строке, позаботится обо всех, кроме самых экзотических случаях (например, новые строки в имени файла).