Removing characters (digits) after the first dash (-) from the end of a fileName

I have thousands of .mp3 files that have recently been required and were appended with a dash - and a series of various amounts of numbers. I would like to remove the last dash and the numbers to right of it.

Some examples are:

songName-artistName-12345.mp3
songName(1973)-artistName-12345.mp3
songName-artistName12d-12345.mp3

What I would like is:

songName-artistName.mp3
songName(1973)-artistName.mp3
songName-artistName12d.mp3

I have tried this:

ls | sed 's/\(.*\)\(-.*\)/mv \"&\" \"\1.mp3\"/' | bash

But, I've been getting a

syntax error near unexpected token '('

I've tried escaping any / but that wasn't much help either. I have all these songs in one folder. And another folder with .wav files.

Thanks for taking the time and reading!

0
задан 7 May 2020 в 20:31

3 ответа

Вам нужно, чтобы этот средний матч не был жадным, иначе он поест вашего артиста:

$ printf %s\\0 *.mp3 | \
  sed -znr 's|(.*)-[^-].*\.mp3$|mv \"&\" \"\1\.mp3\"|e'

Однако переименуйте будет намного быстрее:

$ printf %s\\0 *.mp3 | \
  rename --null 's/(.*)-.*?\.mp3$/$1\.mp3/'
0
ответ дан 19 June 2020 в 21:42

Я думаю, что это должно сделать это:

for f in *.mp3; do
  echo "Moving $f to ${f%-[0-9]*}.mp3"
  # below the action commented
  # mv "$f" "${f%-[0-9]*}.mp3"
done

Вывод:

moving songName(1973)-artistName-12345.mp3 to songName(1973)-artistName.mp3
moving songName-artistName-12345.mp3 to songName-artistName.mp3
moving songName-artistName12d-12345.mp3 to songName-artistName12d.mp3
0
ответ дан 19 June 2020 в 21:42

Не относящийся к Ubuntu вопрос, но в любом случае:

Напомним, что оболочка по-прежнему расширяет метасимволы внутри строк, заключенных в двойные кавычки. По всей вероятности, некоторые имена файлов могут содержать метасимволы оболочки, такие как $ , которые портят вывод, возможно, в сочетании с некоторым взаимодействием локали и тем, как ls любит помещать имена файлов с не -алфавитно-цифровые символы в кавычках (хотя этого не следует делать, когда выводится канал). Попробуйте использовать одинарные кавычки для вывода и вместо этого заключите аргументы sed в двойные кавычки. Для большей надежности сбросьте локаль на что-нибудь нейтральное и используйте ls -N :

$ export LC_ALL=C
$ ls -N | sed "s/\(.*\)\(-.*\)/mv \'&\' \'\1.mp3\'/" |bash

На всякий случай, если у вас разные версии:

$ sed --version
sed (GNU sed) 4.4

$ bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
0
ответ дан 19 June 2020 в 21:42

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

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