Удаление символов с имен файлов [закрыто]

У меня есть файлы. Я хотел бы убрать несколько символов из их имен файлов. Персонажи могли быть на голове или на хвосте. Необязательно, чтобы одна команда побрила их всех.

Два примера:

  • Из файла 01 - SongTitle.mp3 нужно удалить 01 -

  • Из другого файла SongTitle - ArtistName.mp3 хочу убрать - ArtistName

Если возможно, я бы хотел, чтобы тип реализации «строка для удаления» и «строка для сохранения», а не что-то особенное для этих примеров. Я хочу, чтобы команда соответствовала строке и имела «строку для удаления».

3
задан 25 September 2016 в 09:20

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

Как это работает:

  • Сначала определите общую часть (два числа в начале имени файла, сопровождаемого пространством, дефисом и другим пространством), что Вы хотите заменить от всех имен файлов здесь.
  • Затем нам нужен regexp для общей части.
  • Каре ^ соответствует положению перед первым символом в строке и наборе символов [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.

Случай - 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

можно узнать больше на regexp на постоянном-клиенте-expressions.info


Лучший regexp для случая-II

Эта первая часть поднялась с steeldriver

echo "This is a song - Some Artist.mp3" | sed 's/ -[^.]*//'
This is a song.mp3

Как это работает:

  • Здесь подход должен соответствовать части строки после пространства, сопровождаемого дефисом перед точкой . из .mp3 и заменять соответствие расстаются с пробелом.
  • [^.] соответствия любой символ, но не точка .
  • Наконец regexp -[^.]* соответствует пространству, сопровождаемому дефисом один или несколько любой символ, но не точка . или в другом слове прежде, чем встретиться с точкой . который является нашим желаемым 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

Лучшая альтернатива для предотвращения использования loop+sed rename

rename -v 's/^[0-9]* - //' *.mp3  # For the first set
rename -v 's/ -.*/.mp3/' *.mp3   # For the second set
3
ответ дан 1 December 2019 в 16:21

Другие вопросы по тегам:

Похожие вопросы: