Массовое переименование файлов из текстового файла

Массовое переименование файлов из текстового файла

У меня есть папка, содержащая около 7000 файлов, и каждый файл пронумерован, например, 74857.mkv, 74858.mkv и т. д.

введите описание изображения здесь

У меня также есть текстовый файл, в котором содержатся все номера и имена файлов:

В этом порядке:

введите описание изображения здесь

Я хотел бы переименовать каждый файл, заменив его номер на имя. Пример:

74857.mkv > Снято S01 E01.mkv

74858.mkv > Снято S01 E02.mkv

Дайте, пожалуйста, какие-нибудь команды, чтобы это сделать. Я делал это вручную и за 5 дней мне удалось сделать только 50 файлов!

решение1

При условии, что"пример его имени"это строка на строке, расположенная непосредственно над текущим .mkvименем файла, т.е. заданная

$ cat file.txt 
Taken S01 E01
74857.mkv
Taken S01 E02
74858.mkv

вы на самом деле хотите

74857.mkv > Снято S01 E01.mkv

74858.mkv > Снято S01 E02.mkv

затем с GNU parallelи mv:

parallel -N2 echo mv -- {2} {1}.mkv < file.txt

Удалите его, echoкак только убедитесь, что он составляет правильные команды.

решение2

На вашем месте я бы делал это небольшими партиями и тестировал с копией, но вам подойдет что-то вроде этого.

while read n; do read f; mv $f "$n.${f##*.}"; done < file

Прежде чем начать, вам будет полезно проверить вывод

while read n; do read f; echo mv $f "$n.${f##*.}"; done < file > checkfile

Чтобы убедиться в отсутствии ошибок в файле переименования.

Безопаснее, если у вас есть место и время для копирования, чтобы сохранить оригиналы в безопасности до тех пор, пока вы не будете довольны...

while read n; do read f; cp $f "/a/safe/location/$n.${f##*.}"; done < file

Примечание

Чтобы обратить процесс вспять, вам просто нужно поменять местами имена в mvкоманде.

mv "$n.${f##*.}"  $f

решение3

С perl:

perl -lne '$dst = "$_.mkv"; $src = <>; chomp $src; rename $src, $dst
  or warn "$src -> $dst: $!\n"' your-file

С zsh:

zmodload zsh/files # to get a builtin mv
while IFS= read -ru3 dst && IFS= read -ru3 src; do
   mv -- "$src" "$dst.mkv"
done 3< your-file

Связанный контент