Заменить путь к файлу во всех 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 из команды. Таким образом, команда не изменяет файлы.