du дает два различных результата для того же файла

AIX имел, СРАЖАЛ в течение долгого времени (наряду с версией командной строки smitty)

HP-UX раньше имел SAM (долго удержанный от использования), представленный в 1992, который выполнил установки через их posix-стандартизированные программы установки. (swinstall, swlist, swcopy, и т.д.). В дополнение к командной строке SAM выполнил бы их в gui.

23
23.12.2013, 00:50
3 ответа

Действительно необходимо использовать что-то как md5sum или sha1sum проверять целостность.

Если Вы действительно хотите использовать использование размера ls -l или du -b.

du утилита обычно только показывает использование диска файла, т.е. сколько из файловой системы используется им. Это значение полностью зависит от отступающей файловой системы и других факторов как редкие файлы.

Пример:

$ truncate -s 512M foo
$ cat foo >bar
$ ls -l foo bar
-rw-r--r-- 1 michas users 536870912 23. Dez 00:06 bar
-rw-r--r-- 1 michas users 536870912 23. Dez 00:03 foo
$ du foo bar
0       foo
524288  bar
$ du -b foo bar
536870912       foo
536870912       bar

У нас есть два файла оба содержащий 512 МБ нулей. Первый хранится редкий и не использует дискового пространства, в то время как вторые хранилища каждый байт явно на диске. - Тот же файл, но совершенно другое использование диска.

-b вариант мог бы быть хорош для Вас:

   -b, --bytes
          equivalent to '--apparent-size --block-size=1'

   --apparent-size
          print apparent sizes, rather than disk usage; although the apparent
          size is  usually  smaller,  it  may  be  larger  due  to  holes  in
          ('sparse')  files, internal fragmentation, indirect blocks, and the
          like
32
27.01.2020, 19:41

Короткий ответ: не тестируйте размер файла, тестируйте статус возврата команды. Статус возврата единственное надежный признак ли копия, за которой следует (за исключением сравнения этих двух байтов файлов байт, непосредственно косвенно — который избыточен если копия, за которой следуют).

Проверка размера файла не является очень полезным способом проверить ли копия, за которой следуют. В некоторых случаях это может быть полезная проверка работоспособности, например, при загрузке файла с сети. Но здесь существует лучший путь.

Все команды Unix возвращают состояние, чтобы указать, успешно выполнились ли они: 0 для успеха, 1 или больше для ошибок. Так проверьте статус выхода cp. cp будет обычно печатать сообщение об ошибке, если оно перестало работать, указав, какова ошибка. В сценарии статус выхода последней команды находится в волшебной переменной $?.

cp -v traj.trr ~/mysimulation1/
if [ $? -ne 0 ]; then
  echo 1>&2 "cp failed due to the error above"
  exit 2
 fi

Вместо того, чтобы проверить, ли $? нуль, можно использовать булевы операторы.

cp -v traj.trr ~/mysimulation1/ || exit 2

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

set -e
…
cp -v traj.trr ~/mysimulation1/

Что касается причины Ваш скопированный файл был больше, это должно быть, потому что это был редкий файл. Редкий файл является сырой формой сжатия, где блоки, содержащие только пустые байты, не хранятся. Когда Вы копируете файл, cp управляйте чтениями и байтами пустого указателя записей, поэтому где оригинал имел недостающие блоки, копия имеет блоки, полные пустых байтов. В соответствии с Linux, cp управляйте попытками обнаружить редкие файлы, но это не всегда успешно выполняется; cp --sparse=always заставляет его попробовать тяжелее за счет очень небольшого увеличения в процессорное время.

В более общем плане, du мог возвратить различные результаты из-за других форм сжатия. Сжатые файловые системы редки, все же. Если Вы хотите знать размер файла как в числе байтов в файле, в противоположность количеству дисковых блоков это использует, использовать ls -l вместо du.

5
27.01.2020, 19:41

Это - типичная проблема при помещении тех же данных по 2 различным жестким дискам. Вы захотите работать du команда с и дополнительный переключатель, принимая это имеют его - который это должно, учитывая их быть узлами Linux.

Переключатель?

   --apparent-size
          print  apparent  sizes,  rather  than  disk  usage;  although the 
          apparent size is usually smaller, it may be larger due to holes in
          ('sparse') files, internal fragmentation, indirect blocks, and the 
          like

Пример

$ du -sh --apparent-size /home/sam/scsconfig.log ~/scsconfig.log 
93K /home/sam/scsconfig.log
93K /root/scsconfig.log

Вышеупомянутые файловые системы являются локальным диском (/root) в то время как другой /home/sam доля NFS от моего NAS.

$ df -h . /home/sam
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      222G  118G   92G  57% /
mulder:/export/raid1/home/sam
                      917G  566G  305G  65% /home/sam

Так что происходит?

Это смущает много людей, но помните, что, когда файлы хранятся к диску, они используют блоки пространства, даже если они только используют часть тех блоков. Когда Вы работаете du без --apparent-size Вы получаете размер на основе суммы использованного пространства блока диска, не фактического места, занимавшего файлом (файлами).

использование контрольной суммы вместо этого?

Это вероятно более оптимальный вариант, если Вы обеспокоены сравнением 2 деревьев файлов. Можно использовать эту команду, чтобы вычислить контрольную сумму для всех файлов и затем вычислить заключительную контрольную сумму контрольных сумм. Этот пример использование sha1sum но Вы могли столь же легко использовать md5sum вместо этого.

$ cd /some/dir
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum

Пример

$ cd ~/dir1
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum
55e2672f8d6fccff6d83f0bffba1b67aeab87911  -

$ cd ~/dir2
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum
55e2672f8d6fccff6d83f0bffba1b67aeab87911  -

Таким образом, мы видим, что эти 2 дерева идентичны.

(Примечание: найдите, что команда перечислит файлы, когда они появились в файловой системе. Так, при сравнении двух каталогов от другой файловой системы (например, Ext3 по сравнению с APFS), необходимо отсортировать сначала перед финалом sha1sum. (добавленный Xianjun Dong)

8
27.01.2020, 19:41

Теги

Похожие вопросы