我在我的 Soundtrack 文件夹以及我相信的其他地方创建了很多“相对文件路径”(因此它们也可以在我的手机上使用)播放列表,现在我决定将我的经典子文件夹从“欧洲”重命名为“西方”。
如何确保每个文件路径都从 更改
../../Classical/European/[...]
为../../Classical/Western/[...]
?
我通常在 Gedit 中手动编辑这些文件。
所有播放列表和音乐文件都在某个子文件夹中/home/gratis/Music
我在我的 Soundtrack 文件夹以及我相信的其他地方创建了很多“相对文件路径”(因此它们也可以在我的手机上使用)播放列表,现在我决定将我的经典子文件夹从“欧洲”重命名为“西方”。
如何确保每个文件路径都从 更改
../../Classical/European/[...]
为../../Classical/Western/[...]
?
我通常在 Gedit 中手动编辑这些文件。
所有播放列表和音乐文件都在某个子文件夹中/home/gratis/Music
你可以使用这个 perl 单行替换所有文件中所有出现的这个字符串:
请小心,因为此命令将替换所有子文件夹中的所有文件中出现的所有
../../Classical/European/[...]
to ,但不会替换它本身。../../Classical/Western/[...]
.m3u
/home/gratis/Music/
/home/gratis/Music/
如果您只想检查输出,请
-i
从命令中删除。这样,该命令不会更改文件。这与 Markus建议的方法基本相同,只是语法略有不同:
解释
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
选项再次运行它以使其编辑原始文件:这
-i.bak
将导致它编辑文件并创建具有相同名称和扩展名的原始备份.bak
。