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

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

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

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

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

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

6 ответов

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

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

Объяснение

shopt -s globstar: эта команда активирует опцию globstar от bash, которая делает ** соответствует всем файлам и нулям или каталогам и подкаталогам. Таким образом, ~/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
ответ дан 22 May 2018 в 22:55

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

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

Объяснение

shopt -s globstar: эта команда активирует опцию globstar от bash, которая делает ** соответствует всем файлам и нулям или каталогам и подкаталогам. Таким образом, ~/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
ответ дан 18 July 2018 в 13:47

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

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

Объяснение

shopt -s globstar: эта команда активирует опцию globstar от bash, которая делает ** соответствует всем файлам и нулям или каталогам и подкаталогам. Таким образом, ~/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
ответ дан 24 July 2018 в 20:15

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

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

2
ответ дан 22 May 2018 в 22:55
  • 1
    спасибо за ответ, но по какой-то причине это не сработало. предложение тердона – Markus Gratis 6 May 2017 в 07:22

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

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

2
ответ дан 18 July 2018 в 13:47

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

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

2
ответ дан 24 July 2018 в 20:15
  • 1
    спасибо за ответ, но по какой-то причине это не сработало. предложение тердона – Markus Gratis 6 May 2017 в 07:22

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

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