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