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!
Вам нужно, чтобы этот средний матч не был жадным, иначе он поест вашего артиста:
$ printf %s\\0 *.mp3 | \
sed -znr 's|(.*)-[^-].*\.mp3$|mv \"&\" \"\1\.mp3\"|e'
Однако переименуйте будет намного быстрее:
$ printf %s\\0 *.mp3 | \
rename --null 's/(.*)-.*?\.mp3$/$1\.mp3/'
Я думаю, что это должно сделать это:
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
Не относящийся к 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)