2016-09-13 5 views
0

У меня есть несколько папок, содержащих несколько видео-лекций. Названия файлов (видео) похожи на topic blah blah blah - Lecture xx.mp4 Я хочу переименовать их в Lecture xx.mp4Bash скрипт для переименования файлов

Я написал следующий сценарий bash. И, похоже, он зависает (замедляется) и не дает результата.

for file in *.mp4; do 
    echo "Renaming file :: $file" 
    nn=$(grep -o 'Lecture.[0-9]*' "$file") 
    echo $nn 
    #mv "$file" "$nn" 
done 

Просьба помочь мне исправить этот сценарий.

ответ

2

Ваш скрипт ищет содержимое файла (grep pattern [FILE...]), когда вы действительно хотите изменить значение параметра $file. Это должно объяснить, почему ваша команда работает медленно и, похоже, не работает.

Чтобы изменить значение параметра $file, вы можете использовать функцию Bash под названием параметров расширения (см man bash). В вашем случае ${parameter##word}, то есть удалить соответствующий префикс шаблон, может использоваться. ${file##* - } самый длинный матч * -. Обратите внимание, что * - не является регулярным выражением, а шаблоном. Совпадение шаблонов отличается от регулярных выражений (сравните * с .*).

#!/usr/bin/bash 

for file in *.mp4; do 
    new=${file##* - } 
    echo "Renaming '$file' to '$new'" 
    #mv "$file" "$new" 
done 
+0

Но «бла-бла-бла» может также содержать символ '-'. – vvy

+1

Альтернатива, которая позволяет избежать зависимости от пространства-пробела: 'new = $ {file/* Lecture/Lecture}' – John1024

+0

@John это работает. @ MichaWiedenmann большое спасибо. Проблема решена, но можете ли вы объяснить, почему это 'nn = $ (grep -o 'Lecture. [0-9] *'" $ file ")' медленный и неправильный. Я также попробовал «sed» так же неправильно. – vvy

1

Вы могли бы найти жизнь проще с помощью программы rename - это скрипт на Perl. В вашем случае, вы могли бы сделать:

rename --dry-run 's/.*(Lecture \d+)/$1/' *mp4 

Выход

'topic blah blah blah Lecture 01.mp4' would be renamed to 'Lecture 01.mp4' 
'topic blah blah blah Lecture 02.mp4' would be renamed to 'Lecture 02.mp4' 
'topic blah blah blah Lecture 555556.mp4' would be renamed to 'Lecture 555556.mp4' 

Затем удалите --dry-run, если вам нравится то, что он говорит. Он имеет преимущество перед большинством сценариев оболочки ad-hoc, что он не будет клоблировать файлы, и вы можете делать сухие прогоны, и он поддерживает полный синтаксис Perl, чтобы вы могли легко выполнять очень сложные вещи.

+0

кажется полезным, спасибо. – vvy