Изменить много имен файлов на хэш (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
Другие вопросы по тегам