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