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

10

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

===> 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
...

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

guettli
источник
1
Я хотел бы решить эту проблему с помощью обычных инструментов оболочки. Я не говорю, что у вас нет веских причин, но я верю, что вы задали себе вопрос и ответили себе «почему?». В прошлый раз у меня была очень похожая проблема, которую я решил решить, я сразу же оттолкнул Bash в сторону и решил ее в Python. Намного проще (но я уже знал Python, строковые методы, glob.glob и os.rename), и мне также пришлось искать дерево, полное foldernames, с пробелами и другими неуклюжими символами, ни один из которых не является причиной дополнительных
надоело
1
@ nigel222 Я ленивый и хочу набрать как можно меньше символов. Вот почему я не хочу использовать Python здесь. Не пойми меня неправильно. До сих пор Python - мой любимый язык программирования, и я использую его ежедневно.
Геттли

Ответы:

18

Вы могли бы использовать rename...

rename -n 's/^[0-9]+ - //' *

Удалить -nпосле тестирования, чтобы фактически переименовать файлы

объяснение

  • s/old/new/заменить oldнаnew
  • ^ начало строки
  • [0-9]+ некоторые цифры
Занна
источник
какой цветок регулярных выражений поддерживается renameинструментом. Использует ли он PCRE? ... было бы замечательно.
Геттли
5
@guettli, строго говоря, нет, это не PCRE (это регулярные выражения, совместимые с Perl ). Это renameскрипт Perl, поэтому он имеет полную поддержку регулярных выражений Perl; PCRE - только часть этого. Однако все, что вы знаете из PCRE, будет применимо к rename.
тердон
@terdon Мне плевать на реализацию. Если вы посмотрите на это с помощью математических очков, то у вас renameесть Perl-совместимые регулярные выражения. Да, реализация pcre не привыкает. Я понял это :-) Спасибо за ваш быстрый ответ.
Геттли
9

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
heemayl
источник
Да, работает. Спасибо. Поскольку я знаю Perl-совместимое регулярное выражение из Python (которое я использую ежедневно), я предпочитаю renameкоманду. (Меньше печатать нужно).
Геттли
1
@guettli rename- путь, если вы знакомы с PCRE; renameответ был уже дан так должен двигаться с чистым bash. Отметим, pythonчто re(или regex) модуль не полностью совместим с PCRE.
Heemayl
@guettli Кроме того, вы просто понизили мой ответ? : O
Heemayl
Да, я сделал, и я проголосовал за ваш комментарий. Я надеюсь, что вы не принимаете это на свой счет. Не поймите меня неправильно, но мое личное мнение таково, что это ${f#[[:digit:]]*-[[:blank:]]}безобразно. Да, это работает. Но мы живем в 21 веке. Я думаю, что пришло время перейти от «это работает» к «это легко и весело». Если целью является «это работает», то linux никогда не утратит предубеждение, что оно не является дружественным к пользователю. Поскольку вы уже получили много голосов «за», этот «за» голос не должен повредить (я надеюсь). Если это так, скажите мне, и я заберу это обратно.
Геттли
1
@guettli Все, что тебе подходит. Здесь: gnu.org/software/bash/manual/html_node/… Просто отметим, что класс персонажа [[:digit:]]и [[:blank:]]его соответствие были вашими locale, они также довольно распространены в Regex.
Heemayl