我已经在我的 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
下的所有文件(和目录)。~/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
您可以用以下 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
从命令中删除。这样命令就不会改变文件。