Путь к файлу замены во всем m3u в каталоге

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

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

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

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

1
задан 5 May 2017 в 09:08

2 ответа

Это - в основном тот же подход, как предложил Markus, просто немного отличающийся синтаксис:

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

Объяснение

  • shopt -s globstar : эта команда активирует 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.

2
ответ дан 3 December 2019 в 06:54

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

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

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

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

2
ответ дан 3 December 2019 в 06:54

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

Похожие вопросы: