Заменить путь к файлу во всех m3u в каталоге

Я создал много "относительных путей к файлам" (поэтому они также работают на моем телефоне) в моей папке Soundtrack, а также в других местах, в которые я верю, и теперь решил переименовать мою классическую подпапку из "Европейской" в "Западную".

Как я могу убедиться, что каждый из путей к файлам изменен с../../Classical/European/[...] в ../../Classical/Western/[...]?

Я обычно вручную редактирую эти файлы в Gedit.

Все списки воспроизведения и музыкальные файлы находятся в некоторой подпапке /home/gratis/Music

2 ответа

Решение

По сути, это тот же подход, который предлагал Маркус, только немного другой синтаксис:

shopt -s globstar
perl -pe 's|((\.\./){2}Classical)/European/|$1/Western/|' ~/Music/**/*m3u

объяснение

  • shopt -s globstar: эта команда активирует опцию bash globstar, которая делает ** сопоставить все файлы и ноль или более каталогов и подкаталогов. Так, ~/Music/**/*m3u будет соответствовать всем файлам (и каталогам) в ~/Music или его подкаталоги, чье имя заканчивается на m3u,

  • perl -pe: печатать каждую строку ввода после применения скрипта, заданного -e к этому.

  • s|((\.\./){2}Classical)/European/|$1/Western/|: это оператор замещения. Общий формат s|foo|bar| который заменит foo с bar, Более распространенная форма s/foo/bar/ но разделителями могут быть любые символы. Так как здесь мы хотим сопоставить то, что содержит /, Я использовал | в качестве разделителя для ясности.
  • (\.\./){2}: матч ../ ровно два раза. Так как . означает "любой символ" в регулярных выражениях, они должны быть экранированы (\.). Скобки здесь используются для группировки \.\./ вместе так {2} относится к группе.

  • ((\.\./){2}Classical): круглые скобки снова используются для формирования группы, но на этот раз мы можем ссылаться на группу как $1 на правой стороне замены. Вот почему мы заменяем на $1/Western, так как $1 это то, что было подобрано (\.\./){2}Classical,

Если это делает то, что вы хотите, запустите его снова с -i опция, чтобы заставить это редактировать оригинальный файл:

perl -i.bak -pe 's|((\.\./){2}Classical)/European/|$1/Western/|' ~/Music/**/*m3u

-i.bak заставит его отредактировать файл и создать резервную копию оригинала с тем же именем и расширением .bak,

Вы можете заменить все вхождения этой строки во всех файлах, используя этот perl one-liner:

perl -i -pe 's/\.\.\/\.\.\/Classical\/European\//..\/..\/Classical\/Western\//g' /home/gratis/Music/*/*.m3u

Будьте осторожны, так как эта команда заменит все вхождения ../../Classical/European/[...] в ../../Classical/Western/[...] в целом .m3u файлы во всех подпапках /home/gratis/Music/ но нет /home/gratis/Music/ сам.

Если вы просто хотите проверить вывод, удалите -i из команды. Таким образом, команда не изменяет файлы.

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