Intereting Posts

Удаление номеров из имен файлов

У меня проблема с изменением имен файлов в моем каталоге Music/ .

У меня есть список таких имен:

 $ ls 01 American Idiot.mp3 01 Articolo 31 - Domani Smetto.mp3 01 Bohemian rapsody.mp3 01 Eye of the Tiger.mp3 04 Halo.mp3 04 Indietro.mp3 04 You Can't Hurry Love.mp3 05 Beautiful girls.mp3 16 Apologize.mp3 16 Christmas Is All Around.mp3 Adam's song.mp3 A far l'amore comincia tu.mp3 All By My Self.MP3 Always.mp3 Angel.mp3 

И подобное, и я хотел бы сократить все числа перед именами файлов (а не 3 в расширении).

Я пробовал сначала grep только файлы с номером с find -exec или xargs но даже на этом первом этапе я не имел успеха. После того, как я смогу grep я хотел бы сделать фактическое изменение имени.

Это то, к чему я пытался:

 ls > try-expression grep -E '^[0-9]+' try-expression 

и с приведенным выше я получил правильный результат. Затем я попытался сделать следующий шаг:

 ls | xargs -0 grep -E '^[0-9]+' ls | xargs -d '\n' grep -E '^[0-9]+' find . -name '[0-9]+' -exec grep -E '^[0-9]+' {} \; ls | parallel bash -c "grep -E '^[0-9]+'" - {} 

И похоже, но у меня ошибка, например, «Имя файла слишком длинная» или вообще нет вывода. Я думаю, проблема в том, как я использую xargs или find что выражения в отдельных командах работают хорошо.

спасибо за помощь

Чтобы список всех файлов начинался с числа в каталоге,

 find . -maxdepth 1 -regextype "posix-egrep" -regex '.*/[0-9]+.*\.mp3' -type f 

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

В Debian, Ubuntu и производных используется сценарий rename perl.

Чтобы имитировать операцию переименования:

  rename 's/^\d+ //' * -n 

Удалите -n (нет действия) для выполнения операции:

  rename 's/^\d+ //' * 

С небольшим успехом perl rename устанавливается как /usr/bin/rename в вашем дистрибутиве (слухи, что Fedora также использует переименование perl).

См. Страницу переименования perl для получения более подробной информации о других функциях.

Вот что вы можете сделать, используя только bash , с регулярным выражением в условном выражении:

 #! /bin/bash # get all files that start with a number for file in [0-9]* ; do # only process start start with a number # followed by one or more space characters if [[ $file =~ ^[0-9]+[[:blank:]]+(.+) ]] ; then # display original file name echo "< $file" # grab the rest of the filename from # the regex capture group newname="${BASH_REMATCH[1]}" echo "> $newname" # uncomment to move # mv "$file" "$newname" fi done 

При запуске на ваших образцовых именах файлов вывод:

 < 01 American Idiot.mp3 > American Idiot.mp3 < 01 Articolo 31 - Domani Smetto.mp3 > Articolo 31 - Domani Smetto.mp3 < 01 Bohemian rapsody.mp3 > Bohemian rapsody.mp3 < 01 Eye of the Tiger.mp3 > Eye of the Tiger.mp3 < 04 Halo.mp3 > Halo.mp3 < 04 Indietro.mp3 > Indietro.mp3 < 04 You Can't Hurry Love.mp3 > You Can't Hurry Love.mp3 < 05 Beautiful girls.mp3 > Beautiful girls.mp3 < 16 Apologize.mp3 > Apologize.mp3 < 16 Christmas Is All Around.mp3 > Christmas Is All Around.mp3 

Это относительно легко в zsh с zmv :

 zmv '[0-9]## #(*.mp3)' '$1' 

Объяснение: [0-9]## # – это шаблон, который соответствует одной или нескольким цифрам, за которыми следуют ноль или более пробелов. Приведенная выше команда переименовывает все файлы, начинающиеся с этого шаблона, и заканчивается на .mp3 на часть, попавшую в круглые скобки.

Я просто написал несколько строк в объекте Rexx, который удаляет числа с начала файлов. Мои файлы были такими:

Данные:

 003. Atomic Rooster.mp3 087. Crowded House.mp3 

Код:

 #!/bin/rexx 'rxqueue /clear' 'ls | rxqueue' do while queued()>0 parse pull fn parse var fn .'.'rest rest = strip(rest) if pos('.',rest)=0 then iterate "mv '"fn"' '"rest"'" end