изменить много имен файлов для хеширования (sha256)?

У меня есть набор видеофайлов, где все имена файлов являются неполезным мусором.

1) Существует ли легкая команда, чтобы изменить имена всех файлов в папке к хешу, как (sha256) .mp4? Я не хочу перемещаться / копия / изменяет любые файлы, только переименовывает их.

2) Может команда от 1) быть измененной, чтобы только добавить хеш на конец исходного имени файла? Как (настоящее имя) _ (sha256) .mp4

Я довольно плохо знаком с Ubuntu/Linux и был бы очень признателен за объяснение того, что делает каждая часть команды.

0
задан 1 March 2019 в 09:11

3 ответа

Можно на самом деле сделать это с этим 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/' : замените всем с настоящим именем ($_) сопровождаемый новым.
2
ответ дан 26 October 2019 в 03:17

Проверенный на практике. Для имен файлов с пробелами также.

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
0
ответ дан 26 October 2019 в 03:17

Этому нужен простой цикл оболочки:

for i in *.mp4 ; do
    j="$(openssl dgst -sha256 \"$i\" | cut '-d ' -f2)"
    mv "$i" "$j.mp4"
done

2-й части Вашего вопроса нужно немного больше работы:

for i in *.mp4 ; do
    j="$(openssl dgst -sha256 \"$i\" | cut '-d ' -f2)"
    k="${i%%.mp4}"
    mv "$i" "$k_$j.mp4"
done
-2
ответ дан 26 October 2019 в 03:17

Другие вопросы по тегам:

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