Переименуйте несколько файлов, удаляют все символы

Как я могу заменить это

[www.Example.com]Name-episode-77.mp4
FGBs episode 3 dks.mp4 

кому:

HxH 077.mp4
HxH 003.mp4

*Имя файлов не следует за точным шаблоном

Я хочу к:-

  • Удалите все символы и символы
  • Число формата от 3 до 003
  • Добавьте строку в начале имени файла
2
задан 20 October 2015 в 17:06

2 ответа

Эта острота работает на Ваши данные в качестве примера:

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" от команды. Затем можно проверить имена.

2
ответ дан 2 December 2019 в 02:21

Другая возможность состоит в том, чтобы использовать rename (версия жемчуга, которая является стандартной, которые идут с Ubuntu), и регулярное выражение (RE):

rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4

Шаг за шагом:

  1. rename -vn скажет (-v) то, что переименовывает его, будет работать, но не делая их (-n);

  2. Для каждой замены имени (s) первое РЕ со второй строкой, разделенной /;

  3. Первое РЕ соответствует нулю или большему количеству символов нежадным способом (.*?), сопровождаемый одной или несколькими цифрами ([0-9]+), сопровождаемый, что; соответствие цифр сохраняется в первой группе благодаря круглой скобке ((...));

  4. Вторая строка расширяется до команды жемчуга sprintf("HxH %03d", $1) где $1 первая группа, подобранная выше;

  5. Флаг e к s команда говорит, что я хочу выполнить выражение замены и использовать результат, таким образом, sprintf выполняются, и печатает число в $1 в поле размера 3 с продвижением обнуляет ("%03d");

  6. Наконец, подайте заявку 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' ниже.

2
ответ дан 2 December 2019 в 02:21

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

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