Я очень новичок в Linux / командной строке и мне нужно зашифровать имена файлов 10K + (уникальные имена), чтобы они соответствовали зашифрованному имени MD5 в базе данных mySQL.
Я видел, как вы можете переименовать каталог файлов и как получить хеш файла ( mdsum? ), Но я застрял на том, как получить хэш имени файла, а затем переименовать этот файл в сгенерированный хеш, сохраняя расширение то есть
mynicepicture.jpg > fba8255e8e9ce687522455f3e1561e53.jpg
Кажется, это должно быть простое переименование или mv
строка, но я не могу обойти это.
Большое спасибо за ваши идеи
PS Я видел использование функций Perl в нескольких примерах, близких к тому, что я ищу, но понятия не имею, где и как их использовать.
command-line
rename
mv
BradH
источник
источник
fba8255e8e9ce687522455f3e1561e53
для чего используется MD5mynicepicture
, означает ли это, что расширение должно быть удалено перед хэшированием?md5sum <<<"file name"
вfile name
файл существующего или нет, потому что он рассматривает в качестве строки , за исключением подачи его с именем существующих файлов.Ответы:
Вы не сказали, какую оболочку вы хотите использовать, поэтому я предполагаю, что Bash - ответ требует корректировки для работы с другими оболочками.
Версия скрипта:
Этот простой
for
цикл берет каждый файл в текущем каталоге, вычисляет сумму md5 его имени и выводит его. Используйте это, чтобы проверить функциональность, если вы хотите начать переименование заменить второеecho
наmv
.Пояснения
echo -n "$i" | md5sum
- вычислить сумму md5 полного имени файла, включая расширение файла ( Piping ), чтобы исключить изменение расширенияecho -n "$i"
одним из следующих:sum=$(…)
- выполнить…
и сохранить вывод в$sum
( Подстановка команд )${sum%% *}
- выводить все до первого пробела ( подстановка параметров ), так же, как один из следующих:${i##*.}
- вывести все после последней точки (Подстановка параметров), так же, как одно из следующего:Если вам нужно рекурсивно переименовывать файлы в разных папках, используйте
find
с-exec
опцией.источник
Этот
bash
скрипт используетmd5sum
утилиту из GNU coreutils для вычисления MD5-хеша из базового имени (без расширения) любого заданного пути. Вспомогательная функцияmd5name
выполняет фактические вычисления и выводит новое имя с полным путем и расширением.md5name
Функция используется ,awk
чтобы собрать новое имя из частей данного имени пути и результата отmd5sum
.Примеры использования самой функции:
... где
c9e89fa443d16da4b96ea858881320c9
хеш MD5 строкиfile name here
.Удалите
echo
из скрипта вверху, чтобы фактически переименовать файлы. Возможно, вы захотите сохранить выходные данные исходного скрипта в файл (сecho
указанием на месте), если вам в какой-то момент потребуется восстановить имена файлов до их оригиналов.Обратите внимание, что при выполнении этого дважды для набора файлов будет вычисляться хеш MD5 хешей MD5, и что исходное имя файла затем станет невосстановимым, если вы не сделаете тщательные записи о том, какие файлы называются и что после каждого запуска сценария.
источник
awk
часть может быть заменена на «while read sum dummy ; do printf "%s/%s.%s\n' $dir $sum $ext ; done ;
Вам нужно»,dummy
чтобы получить «-».awk
себя , и это мне потребовалось некоторое время , чтобы использоватьbash
коммунальные услуги , а неsystem()
вawk
С
perl
хrename
:(удалить,
-n
когда счастлив).источник
Для
AWK
подхода:Для современных
find
команд не требуется каталог для ввода.
, поэтому [Каталог] можно оставить пустым.-type f
Только находит файлы, что очень удобно , так какmd5sum
не любит каталогов и изменять имя каталога во время работы не будет хорошей идеей. Используйте,-iname pattern
если вы хотите использовать только некоторые файлы, например-iname \*.dat
, если важен регистр, используйте-name
вместо-iname
.Эти
match(...); sub(...)
куски извлечение частей файла и заменить их во входной строке. Обратите внимание, что"^"
и"$"
[pre / ap] отложено для предотвращения замены строки, которая может повторять путь / расширение.Заменить
print(com)
сsystem(com)
фактически выполнить переименование.Если вы хотите использовать
md5sum
фактический файл в качестве имени, вы можете использовать тот факт, чтоmd5sum
выводит сумму и ввод имени файла, чтобы сделать что-то вроде:while read sum file
Будет принимать 2 аргумента, результатыmd5sum
команды, а также назначитьsum
иfile
переменные с ними. Поскольку в немsum
не должно быть пробелов, оноread
должно работать нормально.Очевидно, что его
[echo]
следует удалить при запуске, но всегда полезно при тестировании любых изменений в сценариях проверять поиск перед запуском.Это все предполагает, что вы работаете
bash
. Кроме того, это может быть напечатано одной длинной строкой:источник
Это в подходе, который я часто люблю использовать.
Команда "ls" создает поток текстовых строк. Команда "sed" преобразует каждую строку с правилами сопоставления с образцом. Команда «sed» выводит команду «mv», которая затем передается через оболочку «sh» для выполнения. Параметры команды "mv" похожи на "mv oldfilename newfilename", которое переименовывает файл. Я создаю новое имя файла с помощью команды sed, которая принимает часть перед последней точкой и выводит ее на вход команды "md5sum", а затем берет только хеш из ее вывода.
Проходя через мой процесс, сначала перечислите файлы списка ('head -n 3', чтобы увидеть только первые 3 строки):
Затем подумайте о преобразовании с помощью sed (еще не передавая сгенерированные команды через оболочку)
Есть три модели соответствия:
Я хочу использовать sed, чтобы заменить имя входного файла на «mv filename NEWfilename», но, поскольку я передаю команды через оболочку, я могу генерировать команды, которые получают md5sum, как это
чтобы получить только хэш
В оболочке Unix мы можем использовать операторы backtick (`some_command`) для запуска подкоманды, например,
Возвращаясь к команде mv, я хочу, чтобы sed выдавал «mv here there», где «there» заменяется командой backtick, чтобы получить md5sum. Строка внутри sed replace-string начинается следующим образом
Но явно создает один и тот же хеш для каждого имени файла, так как команда backticked-запускается до того, как sed увидит строку. Чтобы остановить оболочку, выполняющую команду backtick, чтобы sed выдавал обратные черты, мы должны добавить косую черту (также к символу канала), и снова:
Выходные данные также требуют имен файлов в кавычках в случае пробелов, поэтому
Итак, давайте попробуем это, пропустив через оболочку:
Это сработало? Я полагаю:
Вот подход к перекрестной проверке; используйте параметр «ls» «-i» для вывода i-узла файловой системы unix (который не изменяется с «mv»):
Или, используя команду "paste" (пакет 'coreutils')
источник
Мне нравится этот однострочный ответ, но он ломается, потому что он разбирает имя файла. Я также немного столкнулся с ша хэшами.
Я думаю, что он также вытаскивает файлы и помещает их в базу, где была введена команда.
Спасибо.
источник