Bash-скрипты для изменения имен файлов - PullRequest
2 голосов
/ 08 ноября 2010

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

Сначала я хочу удалить пробелы в именах файлов.Я использую tr -d ''.Есть ли ситуации, когда это может потерпеть неудачу?

Во-вторых, многие имена файлов начинаются с цифры или группы цифр.Например, 01-filename.mp3 или 02_file.mp3 и т. Д. Я пытался использовать tr -d [: digit:], но 3 из mp3 исчезает и файл становится _file.mp. Как мне решить эту проблему?

В том же духе у меня есть еще один вопрос.При использовании sed для внесения изменений, как я могу ссылаться на "остаток строки"?Например, моей первой мыслью было регулярное выражение, например ^ [0-9], для обозначения «начинается с числа», но потом я застрял.Как мне сказать «все, что (a) начинается с числа (b), повторяющегося много раз (c) остаток строки» -> заменить на (c) остаток строки?

Ответы [ 4 ]

2 голосов
/ 08 ноября 2010

Рассматривали ли вы команду Linux rename ?

0 голосов
/ 08 ноября 2010

Сначала я хочу удалить пробелы в файле имена. Я использую tr -d ''. Есть любая ситуация, когда это может потерпеть неудачу?

Конечно. Что если у вас есть два файла с одинаковыми именами, кроме пробелов? (один может случайно перезаписать другой, иначе может произойти сбой переименования). Кроме того, работа с именами файлов с пробелами может быть проблемой; Вы должны помнить, чтобы правильно цитировать их.

В ответ на ваши другие проблемы, я бы сказал, что вместо того, чтобы изменять существующие имена, вы можете рассмотреть возможность создания имен из тегов ID3 ​​внутри файлов, а не сохранять имена файлов в каком-либо смысле нетронутыми. Вы можете попробовать 'id3ren'

0 голосов
/ 08 ноября 2010

Я не использую tr достаточно часто, чтобы иметь возможность комментировать tr -d ' ', но остальные ваши проблемы можно решить с помощью правильного регулярного выражения. На самом деле, если вы используете sed, вы можете добавить регулярное выражение для удаления пробелов и устранить необходимость в tr:

sed -r -e 's/ +//g' -e 's/^[0-9]*[_-]*(.+\.mp3)$/\1/I'

Опция -r указывает sed включить расширенный режим, чтобы можно было использовать «новые» функции, такие как модификатор +. Каждое регулярное выражение, следующее за -e, будет применено к каждой строке в указанном порядке.

Первый заменяет один или несколько (+) пробелов ничем, для всех совпадений (g), а не только для первого.

Второе регулярное выражение соответствует любой строке, начинающейся с цифры (квадратные скобки обозначают набор символов для сопоставления, а - обозначает диапазон в наборе). * означает «соответствует нулю или более предшествующего символа». Круглые скобки используются для «группировки» части совпадения для последующего использования. .+ соответствует всем оставшимся символам, а \.mp3 соответствует расширению имени файла (. экранируется обратной косой чертой, поскольку обычно это означает «любой символ», но нам нужен литерал .). \1 в строке замены указывает первую (и единственную, в данном случае) группу. Наконец, модификатор I указывает на то, что при совпадении регистр не учитывается.

Есть много лотов или регулярных выражений онлайн, если вы хотите узнать больше. Урок по регулярным выражениям Perl особенно хорош (и большинство движков регулярных выражений в значительной степени совместимы с Perl).

0 голосов
/ 08 ноября 2010

Примерно так: (не проверено)

sed -e 's/^[0-9]\+\(.*\)$/\1/'

В основном,

  1. Используйте + для повторения один или несколько раз.
  2. Заключите в скобки совпадение «остаток строки» (.*) (Это будет совпадать, даже если остальная часть строки пуста, что было бы плохо в вашем случае)
  3. Используйте обратную ссылку для ссылки на остаток строки \1
...