По-видимому, head
действительно искажает свой ввод, когда это не текстовый файл:
$ wc /bin/ls
431 3454 126496 /bin/ls
$ head -n 431 /bin/ls > a
wc a
431 3447 125378 a
$ diff a /bin/ls
Binary files a and /bin/ls differ
$ md5sum /bin/ls a
42846aa64774a99f0f1feba36ec2e099 /bin/ls
de032f5aa5ef356fb7d5ab4dc622df2e a
$ wc -c /bin/ls a
126496 /bin/ls
125378 a
Стефан Чазелас хорошо замечает в комментариях:
wc -l
сообщает о том, что количество новых строк./ bin / ls
, вероятно, имеет больше байтов после последнего появления0xa
, котороеhead -n 431
не выводит. Инструменты GNU (которые вы, кажется, используете) обычно могут работать с двоичными данными (байтами NUL и произвольно длинными строками).
Итак, причина неправильного вывода при использовании head -n
заключается в том, что после последнего символа \ n
есть дополнительные данные. Глядя на исходный код для GNU head
, я могу подтвердить, что как функция, которая читает по строкам, так и функция, которая читает по байтам, используют один и тот же вызов safe_open ()
, поэтому есть на самом деле не должно быть никакой разницы между тем, что они способны вернуть. Это говорит о том, что использование GNU-реализации head
(которая обычно встречается в большинстве невстроенных операционных систем, использующих Linux) вполне безопасно.
Однако похоже, что он работает правильно, если вы укажете ему работать с байтами вместо строк (из man head
):
-c, --bytes=[-]NUM
print the first NUM bytes of each file; with the leading '-',
print all but the last NUM bytes of each file
С параметром -c
он похоже, создает идентичные файлы:
$ wc -c /bin/ls
126496 /bin/ls
$ head -c 126496 /bin/ls > a
$
$ md5sum /bin/ls a
42846aa64774a99f0f1feba36ec2e099 /bin/ls
42846aa64774a99f0f1feba36ec2e099 a
Это также тот же результат, что и результат dd
:
$ dd if=/bin/ls of=a bs=126496 count=1
1+0 records in
1+0 records out
126496 bytes (126 kB, 124 KiB) copied, 0.000469919 s, 269 MB/s
$ diff a /bin/ls
$
Я не могу указать на какую-либо официальную документацию, в которой указывается, что при использовании - c
, он всегда будет производить правильный двоичный вывод, но это кажется разумным предположением.
zypper
не может очистить(удалить пакет и конфигурацию )действие, подобное apt/aptitude
. Этот факт не упоминается ни на одной странице man
в системе SUSE.
...a program removing user's files is not a good idea.
Таким образом, вы должны вручную удалить все файлы конфигурации с помощью инструмента rm
.