Изменить много имен файлов на хэш (sha256)?
У меня есть куча видеофайлов, в которых все имена файлов бесполезны.
1) Есть ли простая команда для изменения имен всех файлов в папке на хеш, например (sha256).mp4? Я не хочу перемещать / копировать / изменять любые файлы, только переименовывать их.
2) Можно ли изменить команду из 1), чтобы добавить только хеш в конец исходного имени файла? Like (оригинальное название)_(sha256).mp4
Я довольно новичок в Ubuntu/Linux и буду очень признателен за объяснение того, что делает каждая часть команды.
4 ответа
Вы действительно можете сделать это с этим rename
команда:
rename 'chomp(my $new=`sha256sum "$_" | cut -d" " -f1`); s/.*/$new.mp4/' *mp4
Для предварительного просмотра того, что он будет делать перед переименованием, используйте -n
, Например:
$ ls
'my movie file01.mp4' 'my movie file05.mp4' 'my movie file09.mp4'
'my movie file02.mp4' 'my movie file06.mp4' 'my movie file10.mp4'
'my movie file03.mp4' 'my movie file07.mp4'
'my movie file04.mp4' 'my movie file08.mp4'
$ rename -n 'chomp(my $new=`sha256sum "$_" | cut -d" " -f1`); s/.*/$new.mp4/' *mp4
my movie file01.mp4 -> 6a260f4adeb47000afeb9c53029ce0e14b6ea80be5c649ecdb155c8e7cfa1496.mp4
my movie file02.mp4 -> 14f24228ead10d639ef3db11ea09c6216aa80879327a2a57fb549e6474fb05b0.mp4
my movie file03.mp4 -> 6c9ecec6a75e217fa1786dd6f920a5c1db8473f17447595e0d33d7fc3530453a.mp4
my movie file04.mp4 -> 96a29ae5bc3a5e35537bcea1068c746ddba205d17fcc8e522a52402c7ed69927.mp4
my movie file05.mp4 -> 189207823129b57e52c86a743ea7154f65b8eccb5182f322abc3aae35f14057d.mp4
my movie file06.mp4 -> 93be0fd15be56bb22af94a0a0aa272d56f61e77160f1170305d41166d6135913.mp4
my movie file07.mp4 -> 05c92b5632414f14445af3facdb0e187746b3b0f40bad94a5f351aeb7f9a8847.mp4
my movie file08.mp4 -> 0d3cf9c165d4c18af8922b8daa9a6b1031c6762d179fb910b968d60af9aed255.mp4
my movie file09.mp4 -> da04afebaec6ea3d43dc3a0e66b790ab13751b00fd81aa1f882986c097c36298.mp4
my movie file10.mp4 -> 47bf532970d3e759346462a85d15ab9d9171c5a7688a6e90a1e976e071ecd167.mp4
И, чтобы сохранить оригинальное имя:
$ rename -n 'chomp(my $new=`sha256sum "$_" | cut -d" " -f1`); s/.*/$_ $new.mp4/' *mp4
my movie file01.mp4 -> my movie file01.mp4 6a260f4adeb47000afeb9c53029ce0e14b6ea80be5c649ecdb155c8e7cfa1496.mp4
my movie file02.mp4 -> my movie file02.mp4 14f24228ead10d639ef3db11ea09c6216aa80879327a2a57fb549e6474fb05b0.mp4
my movie file03.mp4 -> my movie file03.mp4 6c9ecec6a75e217fa1786dd6f920a5c1db8473f17447595e0d33d7fc3530453a.mp4
my movie file04.mp4 -> my movie file04.mp4 96a29ae5bc3a5e35537bcea1068c746ddba205d17fcc8e522a52402c7ed69927.mp4
my movie file05.mp4 -> my movie file05.mp4 189207823129b57e52c86a743ea7154f65b8eccb5182f322abc3aae35f14057d.mp4
my movie file06.mp4 -> my movie file06.mp4 93be0fd15be56bb22af94a0a0aa272d56f61e77160f1170305d41166d6135913.mp4
my movie file07.mp4 -> my movie file07.mp4 05c92b5632414f14445af3facdb0e187746b3b0f40bad94a5f351aeb7f9a8847.mp4
my movie file08.mp4 -> my movie file08.mp4 0d3cf9c165d4c18af8922b8daa9a6b1031c6762d179fb910b968d60af9aed255.mp4
my movie file09.mp4 -> my movie file09.mp4 da04afebaec6ea3d43dc3a0e66b790ab13751b00fd81aa1f882986c097c36298.mp4
my movie file10.mp4 -> my movie file10.mp4 47bf532970d3e759346462a85d15ab9d9171c5a7688a6e90a1e976e071ecd167.mp4
Объяснение здесь немного сложное, поскольку требует понимания некоторого базового Perl. Основная идея:
my $new=`sha256sum "$_" | cut -d" " -f1`
: это запустит командуsha256sum
на каждом входном файле ($_
является магией Perl для "текущей вещи"), иcut
хранить только хеш Проиллюстрировать:$ sha256sum my\ movie\ file01.mp4 6a260f4adeb47000afeb9c53029ce0e14b6ea80be5c649ecdb155c8e7cfa1496 my movie file01.mp4 $ sha256sum my\ movie\ file01.mp4 | cut -d" " -f1 6a260f4adeb47000afeb9c53029ce0e14b6ea80be5c649ecdb155c8e7cfa1496
chomp()
просто удаляет завершающий символ новой строки из вывода команды. Результат сохраняется в переменной$new
,s/.*/$new.mp4/'
: подставь все (.*
) с$new
название.
Или для другой команды:
s/.*/$_ $new.mp4/'
: заменить все с оригинальным именем ($_
) с последующим новым.
Пробовал и проверял. Для имен файлов с пробелами также.
1)
find . -maxdepth 1 -name '*.mp4' -print0 | while read -d $'\0' i ;do
mv "$i" "`sha256sum "$i" | cut -d" " -f1`.mp4"
done
2)
find . -maxdepth 1 -name '*.mp4' -print0 | while read -d $'\0' i ;do
mv "$i" "${i%%.mp4}-`sha256sum "$i" | cut -d" " -f1`.mp4"
done
Я просто хотел поделиться своими улучшениями в ответе Виджая.
Если вы хотите сделать этот процесс рекурсивным (включая все подкаталоги), вы можете использовать следующую команду:
find . -name '*.mp4' -print0 | while read -rd $'\0' i; do
mv -v "$i" "$(dirname "$i")/$(sha256sum "$i" | cut -d" " -f1).mp4"
done
Для этого нужен простой цикл оболочки:
for i in *.mp4 ; do
j="$(openssl dgst -sha256 \"$i\" | cut '-d ' -f2)"
mv "$i" "$j.mp4"
done
Вторая часть вашего вопроса требует немного больше работы:
for i in *.mp4 ; do
j="$(openssl dgst -sha256 \"$i\" | cut '-d ' -f2)"
k="${i%%.mp4}"
mv "$i" "$k_$j.mp4"
done