2016-04-25 2 views
2

Я пытаюсь переименовать более 1700 видео для эмулятора я собираю,Удаление "!" «[» И «]» из имен файлов

Некоторые файлы могут выглядеть как в следующих примерах:

romfilename1!!! (Japan) [SLUS-01005].mp4 
romfilename2 (USA) [SLUS-28605] (Disc 1).mp4 
romfilename3 (USA) [SLUS-28605] (Disc 2).mp4 

Я пытаюсь достичь следующих результатов:

romfilename1.mp4 
romfilename2 (Disc 1).mp4 
romfilename3 (Disc 2).mp4 

до сих пор я был в состоянии удалить (США) & (Япония) с помощью:

for i in *.mp4 
do 
    mv "$i" "`echo $i | sed 's/ (USA)//'`" 
done 

Итак, теперь я зациклился на том, как я могу удалить восклицательные знаки, Я потратил много времени на поиск ответа, но havnt повезло. Я также зациклился на том, как мне удалось удалить эти коды «[SLUS-28605]» В основном из-за скобок «[» и «]» код внутри не важен. Я преувеличиваю следующее, но эти персонажи все испортили.

for i in *.mp4 
do 
    mv "$i" "`echo $i | sed 's/!!//'`" 
done 

и ...

for i in *.mp4 
do 
    mv "$i" "`echo $i | sed 's/[SLUS-28605]//'`" 
done 

и ..

for i in *.mp4 
do 
    mv "$i" "`echo $i | sed -i 's/[]"[]//g' 
done 

Заранее спасибо за любую помощь, Nem

+3

Попробуйте следующее: 'sed 's/[!] * \ | \ [[^]] * \] \ | * (Япония) * \ | * (США) * // g'' – sat

+0

@sat: добавьте его в качестве ответа. – blackSmith

+0

Я попытался использовать эту команду, но она просто кажется, что она висит и ничего не делает :( – NeMesiS

ответ

1

Вы можете заменить несколько шаблонов в одной строке с помощью sed и должны избегать специальных символов, таких как пробелы и квадратные скобки :

#!/bin/bash 

for i in *.mp4 
do 
    mv "$i" "$(echo $i | sed 's/!!!//; s/\ (USA)\ //; s/\ (Japan)\ //; s/\[SLUS-[^][]*\]//')" 
done 
+1

Но как я могу использовать это, чтобы он менял имя файла? Кажется, он не делает это самостоятельно ... Спасибо – NeMesiS

+0

@NeMesiS Да , он меняет имя файла. Обратите внимание, что вызов 'sed' находится внутри подстановки' $() ', которая выдает второй аргумент имени файла для команды' mv'. – cmaster

+0

@Kadir: я бы не использовал '. *' в течение срока, который должен удалить скобки/круглые скобки, он будет делать злые вещи, когда у вас есть имя файла, например '[foo] bar [baz]', удаляя 'bar' вместе с выражениями в квадратных скобках. Я всегда использовал класс символов, например '[^] [] *' в этих случаях – cmaster

0

Для этого вы можете использовать команду rename. Он поддерживает регулярные выражения. Таким образом, команда выглядит следующим образом:

rename 's/[![]]//g' * 

или

rename 's/[!]*\|\[[^]]*\]\| *(Japan) *\| *(USA) *//g' * 

Хотя пожалуйста двойная проверка человека страница rename доступных в вашей системе. Например. deb-based и rpm-дистрибутивы используют разные версии, а регулярное выражение будет меняться в зависимости от вашей локальной версии переименования.

Регулярное выражение должно быть скорректировано с учетом вашего полного требования, так как на самом деле это не ясно.

Он также спасет от возможных проблем со специальными символами в имени файла, например \n и других.

+0

Удивительно, спасибо всем, кто ценит ... – NeMesiS

+0

Обратите внимание, что 'rename' ma y быть любым из нескольких инструментов, которые, как правило, появляются на машинах Linux и, вероятно, не существуют в системах, отличных от Linux. Поэтому он не переносится, даже между линиями. Поскольку в вопросе не указана конкретная платформа (может быть Linux, OSX, FreeBSD, Solaris, AIX и т. Д.), Лучше всего сделать свой ответ переносимым. – ghoti

0

Удалить! :

for i in *.mp4 
do 
    name=`echo $i | sed 's/!//g'` 
    mv "$i" "$name" 
done 

Eemove кнопку [???]:

for i in *.mp4 
do 
    name=`echo $i | sed 's/\[[^][]*\]//g'` 
    mv "$i" "$name" 
done 

Удалите (???):

for i in *.mp4 
do 
    name=`echo $i | sed 's/([^)(]*)//g'` 
    mv "$i" "$name" 
done 

Если вы хотите удалить все сразу:

for i in *.mp4 
do 
    name=`echo $i | sed 's/!//g' | sed 's/([^)(]*)//g' | sed 's/\[[^][]*\]//g' ` 
    mv "$i" "$name" 
done 
+0

Как я уже прокомментировал ответ Кадира: не рекомендуется использовать '. *', Если вы хотите удалить заключенные в квадратные скобки термины. Используйте класс символов вместо оператора '.' Или будьте готовы, чтобы ваше регулярное выражение делало то, чего вы не хотите. – cmaster

+0

@cmaster Вы имеете в виду что-то вроде [A-Za-z_0-9] *? – Fabich

+0

Что-то вроде '[^] [] *'. Конечно, чем более строгим, тем меньше вероятность того, что вы удалите то, чего не хотите. Но также, чем более строгим, тем более вероятно, что вы не хотите удалять нужные вещи. Поэтому я бы не сказал, что один из '[^] [] *' или '[A-Za-z_0-9]' лучше другого. Важная часть состоит в том, чтобы исключить разделители, которые вы соответствуете. – cmaster

3

Вам не нужно sed для любого из этого.

shopt -s extglob 
for i in *.mp4 
do 
    # Remove all !; the ! doesn't need to be escaped if history 
    # expansion is disabled. 
    new_i=${i//\!} 

    # Remove the *first* parenthesized group (which contains the country) 
    new_i=${new_i/ (+([!)]))} 

    # Remove the bracketed group 
    new_i=${new_i// \[*]} 

    #mv "$i" "$new_i" 

    echo "mv \"$i\" \"$new_i\"" 

done 

Вы можете удалить echo, как только вы убедитесь, что mv команды являются правильными.

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