2015-06-02 4 views
1

У меня есть набор файлов, их имена могут содержать алфавит, цифры, пробелы, точки, дефисы или символы подчеркивания.Удалите все из имен файлов, кроме определенной части, принятой RegEx

Возможности могут быть:

word-123_AnotherWord-asdf1234567.mp4 
word-123_AnotherWord-ASDF1234567.mp4 
word-123_AnotherWord-1234567asdf.mp4 
word-123_AnotherWord-1a2s3d4f5g6.mp4 
word-123_AnotherWord-asdf-123456.mp4 
word-123_AnotherWord-asdf_123456.mp4 
word-123_AnotherWord-123456-asdf.mp4 
word-123_AnotherWord-123456_asdf.mp4 
word-123_AnotherWord-asdf123456-.mp4 
word-123_AnotherWord-asdf123456_.mp4 
word-123_AnotherWord--asdf123456.mp4 
word-123_AnotherWord-_asdf123456.mp4 
word-123_AnotherWord--asdf_12345.mp4 
word-123_AnotherWord-_asdf-12345.mp4 
word-123_AnotherWord-asdf--12345.mp4 
word-123_AnotherWord-asdf_-12345.mp4 
... etc 

Я хочу:

(1) с RegEx взять последний 11 текстовую строку из их имен (все, что было).

может быть RegEx для этого может быть такой:

/([a-zA-Z0-9-_]{11})+(?:\.mp4)$/ 

(2) переименовать файлы с помощью принятых RegEx части, чтобы быть:

outputregex.mp4 

Что-то вроде этого:

for i in *.mp4; 
    do new_name=RegEx from i; 
    $i rename to $new_name; 
done 

Спасибо за сотрудничество!

+0

Я использую Perl для переименования. Что-то по этой линии: http://www.leancrew.com/all-this/2011/09/renaming-with-larry-wall/ – 4ae1e1

+1

Используйте [rename] (http://man7.org/linux/man-pages /man1/rename.1.html) – 123

+1

Вы говорите, что включены «дефис», но вы удаляете его в своем примере. Это неясно. –

ответ

2

Из вашего примера и комментарии, вы, кажется, хотите:

rename 's/^.*\W(\w{1,11}\.mp4)$/$1/' *.mp4 

Эта первая команда соответствует только если есть не альфа символ перед словом. Если это не является обязательным требованием, то вы можете использовать этот один:

rename 's/.*?(\w{1,11}\.mp4)$/$1/' *.mp4 

Если вы хотите, последние 11 символов перед .mp4, что они есть, использовать

rename 's/.*?(.{1,11}\.mp4)$/$1/' *.mp4 

Там нет необходимости в цикле, rename делает это за вас.

+0

Спасибо @Denys, но все же хочу ограничить длину строки до 11, как вы видели в моей попытке – Homer

+1

@SomeOne Я нашел ваше точное требование неясным. Я редактировал. При переименовании легко изменить шаблон замены регулярного выражения для вашего конкретного варианта использования. –

+0

Да, вы правы, я был неясно, извините. ну, я отредактировал его сейчас – Homer

1

Вы можете использовать этот скрипт: rename

for f in *.mp4; do 
    rename 's/^.+?\b(\w+)(?=\.mp4$)/$1/' "$f" 
done 

Вы можете просто использовать (благодаря @anishsane) одной команды:

rename -n 's/^.+?([\w-]{11})\.mp4$/$1/' *.mp4 

PS: Используйте -n вариант для сухой пробег команды rename.

+2

'rename' может принимать несколько имен файлов одновременно. Нет необходимости в цикле for. – anishsane

+1

О да, это так. Я должен был понять, что (отредактировано) – anubhava

+0

извините @anubhava, я не был достаточно ясным, я хочу взять строку с конца, последний 11 до '.mp4', спасибо! – Homer

Смежные вопросы