
У меня есть папка, содержащая около 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