У меня есть файлы. Я хотел бы убрать несколько символов из их имен файлов. Персонажи могли быть на голове или на хвосте. Необязательно, чтобы одна команда побрила их всех.
Два примера:
Из файла 01 - SongTitle.mp3
нужно удалить 01 -
Из другого файла SongTitle - ArtistName.mp3
хочу убрать - ArtistName
Если возможно, я бы хотел, чтобы тип реализации «строка для удаления» и «строка для сохранения», а не что-то особенное для этих примеров. Я хочу, чтобы команда соответствовала строке и имела «строку для удаления».
Поскольку Вы надеетесь переименовывать файл 01 - This is a song.mp3
кому: This is a song.mp3
обрезка 01 -
вначале. Это может быть сделано как это,
$ echo "01 - This is a song.mp3" | sed 's/^[0-9]* - //'
This is a song.mp3
^
соответствует положению перед первым символом в строке и наборе символов [0-9]
соответствует единственной цифре между 0 и 9. ^[0-9]*
соответствия одна или несколько цифр между 0 и 9 в начале строки.^[0-9]* -
наш желаемый regexp, который соответствует одной или нескольким цифрам между 0 и 9 в начале строки, сопровождаемой пространством, дефисом и другим пространством.От man sed
s/regexp/replacement/
Attempt to match regexp against the pattern space. If successful,
replace that portion matched with replacement.
Например, попробуйте его в терминале
$ echo "Good day" | sed 's/day/night/'
Good night
$ echo "Good day" | sed 's/day//' ## replacement is kept blank
Good
sed
.Второй набор файлов Вы хотите переименовать от This is a song - Some Artist.mp3
кому: This is a song
обрезка - Some Artist
в конце. Попробовать
$ echo "This is a song - Some Artist.mp3" | sed 's/ -.*/.mp3/'
This is a song.mp3
.mp3
быть неповрежденным..mp3
таким образом, это остается в строке в конце строки после замены..
соответствует отдельному символу, не заботясь, каков тот символ. Единственным исключением являются символы разрыва строки.-.*
соответствия один или несколько любых символов после пространства и дефиса. Обратите внимание, что это будет соответствовать .mp3
также.sed
Я заменил часть соответствия .mp3
можно узнать больше на regexp на постоянном-клиенте-expressions.info
Эта первая часть поднялась с steeldriver
echo "This is a song - Some Artist.mp3" | sed 's/ -[^.]*//'
This is a song.mp3
.
из .mp3
и заменять соответствие расстаются с пробелом.[^.]
соответствия любой символ, но не точка .
-[^.]*
соответствует пространству, сопровождаемому дефисом один или несколько любой символ, но не точка .
или в другом слове прежде, чем встретиться с точкой .
который является нашим желаемым regexp.sed
и for
цикл в оболочке удараДля переименования файлов, как описано в случае-I, можно использовать:
for i in *.mp3; do mv "$i" "$(echo $i | sed 's/^[0-9]* - //')" ; done
Для переименования файлов, как описано в случае-II, можно использовать:
for i in *.mp3; do mv "$i" "$(echo $i | sed 's/ -.*/.mp3/')" ; done
rename
rename -v 's/^[0-9]* - //' *.mp3 # For the first set
rename -v 's/ -.*/.mp3/' *.mp3 # For the second set