Почему изменение имени файла не меняет его контрольную сумму?

findимеет огромное количество опций и деталей. Другой вариант — использовать printf с%y

$ find. -printf "%p:%y\n"
./dir:d
./file:f

где %yдобавляет "d" или "f", какls -l

$ find. -printf "%p%y\n" | sed 's!d$!/! ; s!f$!!' 
10
26.10.2020, 09:15
5 ответов

Имя файла — это строка в записи каталога, а ряд других метаданных (типа файла, разрешений, владельца, меток времени и т. д. )хранится в индексном узле. Таким образом, имя файла не является частью того, что составляет фактические данные файла. Фактически, один файл может иметь любое количество имен (жестких ссылок )в файловой системе и может быть дополнительно доступен через любое количество символических ссылок с произвольными именами.

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

Изменение имени файла (или владельца, временных меток, разрешений и т. д. )или доступ к нему через одно из других его имен или символических ссылок, если таковые имеются, поэтому никак не повлияет на контрольную сумму MD5 файла..

41
18.03.2021, 22:54

Да, как вы сказали, «имя файла не является частью данных файла»

Имя файла не может быть сохранено в файле. Если бы это было так, он бы изменил файл. Однако можно проверить -суммирование имени файла, других метаданных и данных файла, но обычно это плохая идея.

Имя файла -является частью содержащего его каталога. Не является частью файла.

Если вы хотите получить и контрольную сумму, и хэш, то сработает что-то вроде этого

(Вероятно, это не очень хорошая идея)

echo "$filename" | xargs -n1 -I{} bash -c 'echo "$1"; cat "$1"' x {} | shasum

10
18.03.2021, 22:54

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

Это на самом деле полезно, потому что таким образом вы можете обнаружить дубликаты, даже если они имеют разные имена. Такие программы, как fdupesи jdupes, ищут дубликаты и фактически используют контрольные суммы для ускорения процесса (. Контрольная сумма — это то, что известно как инвариант ).

3
18.03.2021, 22:54

when I change a file's name this does not affect its checksum (I've tried SHA-1, SHA-256 and MD5).

Что ж, это несколько ложная связь. SHA -1, SHA -256 и MD5 не вычисляют хэши файлов или имен файлов, они вычисляют хэши битовых потоков. Таким образом, результат, который вы получаете, полностью зависит от того, что вы решите дать в качестве входных данных, а вы этого не показали.

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

Но это не должно быть сделано так. Вот SHA -256 хэшей двух файлов и их имен:

$ echo hello > a.txt; cp a.txt b.txt
$./checksum.sh a.txt  b.txt 
aed49f7730ca0736fe1a021375d1ca9b509a4e72910b422578df8b4b1930aeca  -
bad46702033923726add35ef8d97570f1aa40d93dad1d6ba63e7b051a34b9efc  -

Сценарий просто добавляет имена файлов к хешированным данным. Другое приложение может включать метаданные во входной хэш вместе с содержимым файла.или включать хэши, которые охватывают только часть данных.

Очевидно, что включение имени файла имеет тот недостаток, что даже на один и тот же файл можно ссылаться под разными именами и, следовательно, он может иметь множество различных хэшей:

/tmp/test$./checksum.sh a.txt./a.txt /tmp/test/a.txt 
aed49f7730ca0736fe1a021375d1ca9b509a4e72910b422578df8b4b1930aeca  -
85ec58226886f4f853212b2d21bb2fb72447813ac13a59e9376b2e0c02074839  -
25c1c072481131e07c3fc20d16109472872233f658f4df3c4982fb195a048b96  -

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

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


Приведенный выше скрипт:

$ cat checksum.sh
#!/bin/bash
for f in "$@"; do
        (printf "%s\0" "$f" ; cat "$f") | sha256sum - 
done
10
18.03.2021, 22:54

Why? file name is not a part of file data? does it depend on file system?

Имя файла является свойством его прикрепления к каталогу, а не свойством самого файла. В традиционных файловых системах UNIX один и тот же файл может быть присоединен более чем к одному каталогу с разными именами в каждом. Файлу даже не обязательно иметь имя --, если он не прикреплен ни к какому каталогу, он безымянный.

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

Например, «foo.bak» никогда не будет иметь тот же хэш, что и «foo», даже если это его резервная копия. И идентичные файлы с разными именами не могли быть обнаружены -в целях дублирования.

4
18.03.2021, 22:54

Теги

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