Shaving Charactors от имен файлов
У меня есть несколько файлов. Я хотел бы обрезать несколько символов из их имен файлов. Символы могут быть на голове или хвосте. Не нужно быть одной командой, чтобы побрить их всех.
Два примера:
Из файла
01 - SongTitle.mp3
хочу раздеться01 -
Из другого файла
SongTitle - ArtistName.mp3
хочу раздеться- ArtistName
Если возможно, я бы хотел, чтобы "строка для удаления" и "строка для хранения" были реализованы, а не как нечто конкретное для этих примеров. Я желаю, чтобы команда соответствовала строке и имела "строку для удаления".
1 ответ
Дело - я
Как вы хотите переименовать файл 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]* -
желаемое регулярное выражение, которое соответствует одной или нескольким цифрам от 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
,
Дело - II
Второй набор файлов, из которого вы хотите переименовать 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
Вы можете узнать больше о регулярных выражениях на регулярном выражении
Лучшее регулярное выражение для случая II
Эту часть я снял со стального водителя
echo "This is a song - Some Artist.mp3" | sed 's/ -[^.]*//'
This is a song.mp3
Как это устроено:
- Здесь подход состоит в том, чтобы сопоставить часть строки после пробела с последующим дефисом перед точкой
.
из.mp3
и заменить соответствующую часть на пустую. [^.]
соответствует любому символу, но не точке.
- Наконец, регулярное выражение
-[^.]*
соответствует пробелу, за которым следует дефис, один или несколько символов, но не точка.
или другими словами, прежде чем встретить точку.
что является нашим желаемым регулярным выражением.
Переименование файла
Переименуйте файлы, используя sed
а также for
петля в оболочке bash
Чтобы переименовать файлы, как описано в case-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
Лучшая альтернатива, чтобы избежать использования loop+sed rename
rename -v 's/^[0-9]* - //' *.mp3 # For the first set
rename -v 's/ -.*/.mp3/' *.mp3 # For the second set