Как я могу заменить это
[www.Example.com]Name-episode-77.mp4
FGBs episode 3 dks.mp4
кому:
HxH 077.mp4
HxH 003.mp4
*Имя файлов не следует за точным шаблоном
Эта острота работает на Ваши данные в качестве примера:
for i in *; do echo "$i";mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"'); done;
Объяснение:
for i in *;
do
echo "$i";
mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"');
done;
for i in *;do
-> цикл через все файлы в текущем каталоге
echo "$i";
-> пишут текущий файл (см. про-ГРЭС/вход),
mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"');
-> переименовывающий команду (настоящее имя к выводу команды жемчуга) цифры извлечения команды жемчуга от данного имени файла и печати "HxH", число с продвижением 0s и ".mp4"
Важное примечание:
Команда, данная работы над двумя образцами, вводит Вас обеспеченный. Необходимо определенно протестировать его прежде, чем применить его к фактическим файлам. Поэтому я рекомендовал бы удалить mv "$i"
от команды. Затем можно проверить имена.
Другая возможность состоит в том, чтобы использовать rename
(версия жемчуга, которая является стандартной, которые идут с Ubuntu), и регулярное выражение (RE):
rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
Шаг за шагом:
rename -vn
скажет (-v
) то, что переименовывает его, будет работать, но не делая их (-n
);
Для каждой замены имени (s
) первое РЕ со второй строкой, разделенной /
;
Первое РЕ соответствует нулю или большему количеству символов нежадным способом (.*?
), сопровождаемый одной или несколькими цифрами ([0-9]+
), сопровождаемый, что; соответствие цифр сохраняется в первой группе благодаря круглой скобке ((...)
);
Вторая строка расширяется до команды жемчуга sprintf("HxH %03d", $1)
где $1
первая группа, подобранная выше;
Флаг e
к s
команда говорит, что я хочу выполнить выражение замены и использовать результат, таким образом, sprintf
выполняются, и печатает число в $1
в поле размера 3 с продвижением обнуляет ("%03d"
);
Наконец, подайте заявку rename
управляйте во все файлы, заканчивающиеся в .mp4
(*.mp4
).
См.:
% ls
FGBs episode 3 dks.mp4 [www.Example.com]Name-episode-77.mp4
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4
Обратите внимание, что это - просто тестовый прогон; переименовывает не может быть отменен..., давайте выполним это для реального теперь:
% rename -v 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4
% ls
HxH 003.mp4 HxH 077.mp4
Регулярное выражение действительно мощно.
Заметьте, что только первый набор чисел будет использоваться:
% touch "Another serie 2 ep 34.mp4"
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
Another serie 2 ep 34.mp4 renamed as HxH 002.mp4
Избегать, чтобы... учились, например, https://stackoverflow.com/questions/5320525/regular-expression-to-match-last-number-in-a-string и были осторожны с "4" в "mp4"...
Кроме того, это перестанет работать, если имя не будет содержать чисел---, см. комментарий @kos' ниже.