Переименование файлов с помощью одной строки

У меня есть этот каталог и вы хотите переименовать файлы:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Результат должен выглядеть так:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Я хотел бы решить это с помощью обычных инструменты оболочки.

1
задан 19 January 2017 в 21:26

1 ответ

bash, чтобы отделить требуемую часть от начала:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Расширенная форма:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echo для сухого хода; избавиться от него для действительного действия:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Пример:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg
9
ответ дан 23 May 2018 в 02:17
  • 1
    Да, работает. Спасибо. Поскольку я знаю perl-совместимое регулярное выражение из Python (которое я использую ежедневно), я предпочитаю команду rename. (Требуется меньше ввода текста). – guettli 20 January 2017 в 10:33
  • 2
    @guettli rename - это путь, если вы знакомы с PCRE; ответ rename уже был дан, поэтому нужно перемещаться с чистым bash. Просто отметить, что модуль python re (или regex) не полностью совместим с PCRE BTW. – heemayl 20 January 2017 в 10:35
  • 3
    @guettli Также вы просто отказали мне в ответе? : O – heemayl 20 January 2017 в 10:36
  • 4
    Да, я сделал, и я поддержал ваш комментарий. Надеюсь, вы не примете его лично. Не поймите меня неправильно, но мое личное мнение в том, что этот ${f#[[:digit:]]*-[[:blank:]]} уродлив. Да, это работает. Но мы живем в 21 веке. Я думаю, что пришло время переключиться с «это работает». «легко и весело». Если «работает», является ли цель, тогда Linux не потеряет предубеждения о том, что он не является дружественным к пользователю. Поскольку у вас уже есть много голосов, этот проголосовавший не должен болеть (надеюсь). Если да, скажите мне, и я заберу это. – guettli 20 January 2017 в 10:40
  • 5
    @guettli Все, что вам подходит. Здесь: gnu.org/software/bash/manual/html_node/… Чтобы отметить, что класс символов [[:digit:]] и [[:blank:]] был там, чтобы соответствовать вашему locale, это довольно общий в Regex тоже. – heemayl 20 January 2017 в 10:52

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

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