Во-первых, несколько вопросов оболочки:
for fname in `find …`
поскольку это исказит имена файлов и перестанет работать (потому что командная строка является слишком длинной), если существует слишком много файлов со слишком длинными именами. Использовать find -exec
вместо этого. Так как Вы должны окружить расширение в команде, выполняемой find
, вызовите оболочку."$fname"
, "$(echo …)"
).echo
обратные косые черты искажений на нескольких оболочках (это также искажает несколько начала аргументов -
, но это не проблема здесь, так как все аргументы начнутся ./
). Способ распечатать любую строку буквально printf "%s\n" "$fname"
, или printf "%s"
"$fname" для предотвращения заключительной новой строки. Здесь я не вижу оснований для взятия хеша имени файла плюс заключительная новая строка в противоположность хешу имени файла.Таким образом, мы получаем эту команду:
find . -type f -exec sh -c 'mv "$0" "$(printf "%s" "$0" | sha1sum | cut -f1 -d" ").html' {} \;
Это будет немного быстрее для вызова оболочки для целого пакета имен сразу.
find . -type f -exec sh -c 'for fname; do mv "$fname" "$(printf "%s" "$fname" | sha1sum | cut -f1 -d" ").html; done' _ {} +
Проблема с этим методом - это если mv
начинает действовать прежде find
закончил пересекать каталог, файлы, которые были перемещены, могут быть взяты mv
. Это не проблема с Вашей командой, потому что она ожидает find
закончиться прежде, чем запустить движущиеся файлы. Так помещает переименованные файлы в другую иерархию каталогов. Это решит другую проблему, которую также имеет Ваша предложенная команда, который является этим mv
может перезаписать существующий файл, который, оказывается, называют
.
mkdir ../staging
find . -type f -exec sh -c 'for fname; do mv "$fname" ../staging/"$(printf "%s" "$fname" | sha1sum | cut -f1 -d" ").html; done' _ {} +
find . -depth \! -name "." -type d -exec rmdir {} +
mv ../staging/* .
Теперь по Вашему основному вопросу: два файла с различными путями отобразятся на два различных хеша SHA-1. Математически разговор, там существуйте отличные строки с идентичными хешами SHA-1 (это очевидно, так как существует бесконечно много строк, но только конечно много хешей). Однако в сущности никто не знает, как найти их: нет никакой известной коллизии для SHA-1. Возможно, что однажды в будущем SHA-1 будет поврежден, в этом случае Ваша процедура будет безопасна только против случайных коллизий, не против злонамеренных взломщиков. Если это происходит (не скоро), необходимо обновить до того, что считают безопасным хеш-алгоритмом в то время.
Что касается Вашего второго вопроса: хеш полностью определяется строкой, которую Вы хешируете. Таким образом, если у Вас есть два названные файла tweedledum/staple
и tweedledee/staple
и Вы выполняете ту процедуру переименования из каждого каталога tweedledee
и tweedledum
в свою очередь затем оба каталога закончатся с названным файлом 1c0ee9c1eed005a476403c7651b739ae5bc7cf2a.html
. Если Вы хотите иметь различные имена, необходимо поместить некоторое различающее содержание в хешированный текст, такой как название каталога.
Попытайтесь сначала преобразовать его в файл ISO, с mdf2iso
(необходимо установить его) как это:
mdf2iso your_file.mdf
Linux не может смонтировать mdf файл (который является закрытым форматом), исходно. Или, можно попытаться переименовать его в "your_file.iso" и смонтировать его с командой, которую Вы дали, но это не работает с каждым изображением mdf.
Или если Вы используете X-сервер, можно попробовать программное обеспечение acetoneiso
который является в основном своего рода Инструментами Демона / Алкоголь 120% для Linux.
Существует также FuseISO , драйвер файловой системы пользовательского пространства. Хотел бы я знать об этой опции несколько лет назад, потому что я тоже только что конвертировал их с помощью mdf2iso
. Поскольку я предпочитаю сохранять исходные файлы, это сделано для беспорядка.
mdf2iso
находится вAcetoneISO
на Fedora. – polemon 27.06.2017, 05:20