替换目录中所有 m3u 的文件路径

替换目录中所有 m3u 的文件路径

我已经在我的 Soundtrack 文件夹中创建了很多“文件路径相对”(因此它们也可以在我的手机上运行)播放列表,但我相信在其他地方也创建了很多播放列表,现在我决定将我的古典音乐子文件夹从“欧洲”重命名为“西方”。

我如何确保每个文件路径都从 更改 ../../Classical/European/[...]../../Classical/Western/[...]

我通常在 Gedit 中手动编辑这些文件。

所有播放列表和音乐文件都位于/home/gratis/Music

答案1

这基本上与建议作者 Markus 的语法略有不同:

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

解释

  • shopt -s globstar:此命令激活 bash 的 globstar 选项,使其**匹配所有文件和零个或多个目录和子目录。因此,将匹配名称以 结尾的其子目录~/Music/**/*m3u下的所有文件(和目录)。~/Musicm3u

  • perl -pe将给出的脚本应用-e到每个输入行后,打印该行。

  • s|((\.\./){2}Classical)/European/|$1/Western/|:这是替换运算符。它的一般格式是 ,s|foo|bar|它将替换foobar。更常见的形式是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

您可以用以下 perl 单行命令替换所有文件中出现的该字符串:

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

请小心,因为此命令将替换所有子文件夹中所有文件中出现的../../Classical/European/[...]to ,但不会替换其本身。../../Classical/Western/[...].m3u/home/gratis/Music//home/gratis/Music/

如果您只想检查输出,请-i从命令中删除。这样命令就不会改变文件。

相关内容