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
Другие вопросы по тегам