使用模式匹配批量重命名目录

使用模式匹配批量重命名目录

我想将此目录结构更改为其后的目录结构。尽管还存在另一个目录批量重命名问题,但这个问题完全不同。

l
'001. Aretha Franklin - Respect.mp3'*
'002. Ben E. King - Stand by Me.mp3'*
'003. Sam & Dave - Soul Man.mp3'*
'090. Archie Bell & The Drells; The Drells - Tighten Up, Pt. 1.mp3'*

for i in *.mp3; do echo $i | sed -E 's/([0-9]{3}. )(.*) *( - )(.*) *(.mp3)/\4\3\2\5/'; done;

Respect - Aretha Franklin.mp3
Stand by Me - Ben E. King.mp3
Soul Man - Sam & Dave.mp3
Tighten Up, Pt. 1 - Archie Bell & The Drells; The Drells.mp3

如果我尝试使用就地选项,无论有没有输入文件,我都会得到以下结果:

for i in *.mp3; do echo $i | sed -iE 's/([0-9]{3}. )(.*) *( - )(.*) *(.mp3)/\4\3\2\5/'; done;
sed: -e expression #1, char 47: invalid reference \5 on `s' command's RHS

ETC。

for i in *.mp3; do echo $i | sed -iE 's/([0-9]{3}. )(.*) *( - )(.*) *(.mp3)/\4\3\2\5/'<$i; done;
bash: $i: ambiguous redirect

ETC。

for i in *.mp3; do echo $i | sed -Ei 's/([0-9]{3}. )(.*) *( - )(.*) *(.mp3)/\4\3\2\5/'; done;
sed: no input files

ETC。

for i in *.mp3; do echo $i | sed -Ei 's/([0-9]{3}. )(.*) *( - )(.*) *(.mp3)/\4\3\2\5/' <$i; done;
bash: $i: ambiguous redirect

ETC。

早在 1970 年代,我能够在 Unix 中直接编辑目录,因为目录列表本身就是一个文件。但今天我似乎无法做到这一点。

vi . 给出一个空白屏幕,其中填充了正常的空文件条目,最下面一行显示以下内容:

"." is a directory

尽管

ed .

Is a directory

我今天该如何批量修改目录列表?如您所见,我终于正确地解决了表达式问题,至少在 sed 中是这样。如果它们也存在问题,请告诉我。我非常感谢您的帮助。

答案1

当你这样做

echo $i | sed ...

sed 正在运行字节流从标准输入流读取,而不是从文件的目录条目读取 - 因此“就地”编辑没有意义。

此外,GNU sed 将参数 after-i视为可选的备份后缀,因此当您写入时sed -iEE不再将其解析为指示扩展正则表达式语法的标志 - 这会破坏您的捕获分组。

如果你想通过使用 sed 操作文件名称来重命名文件,你需要在命令替换并将结果作为目标参数传递给mv命令,例如:

for i in *.mp3; do mv -- "$i" "$(echo "$i" | sed -E 's/pattern/replacement/')"; done

或者

for i in *.mp3; do mv -- "$i" "$(sed -E 's/pattern/replacement/' <<< "$i")"; done

如果您想使用 shell 重定向而不是管道来为 sed 提供标准输入。请注意,单个命令不能同时接受来自管道和重定向的标准输入 - 这是“模糊重定向”。

(在 1970 年代,您会使用反引号来`echo "$i" | sed -E s/pattern/replacement/`进行命令替换 - 它们现在已经被弃用,尽管仍然受支持。)请注意使用双引号,如果没有双引号,命令将在包含空格或其他 shell 特殊字符的文件名上中断。

在当前的 Ubuntu 系统上,应该有一个基于 Perl 的rename命令直接对目录进行操作:

rename 's/pattern/replacement/' *.mp3

其中pattern是 Perl 兼容正则表达式 (PCRE)。还有一个mmv命令(由同名的 Ubuntu 包提供)可以使用 shell glob 而不是正则表达式,并且通常更容易进行简单的重新排列,例如:

mmv '*. * - *.mp3' '#3 - #2.mp3'

两者rename都有mmv一个-n选项,可让您试运行重命名。

答案2

尝试一下mmv。对于你的情况:

mmv '[0-9][0-9][0-9]. * - *.mp3' '#5 - #4.mp3'

mmv用于#1第一个通配符匹配,#2用于第二个通配符匹配,等等;在这个模式中,我们有三个通配符作为前导数字,然后是一个文字点,一个文字空格,然后是歌曲艺术家(#4)和歌曲标题(#5),中间用“-”分隔。

在替换部分,我们省略不需要的数字并交换艺术家和标题。

当你使用正确的工具时,生活可以变得如此简单。;-)

mmv真是奇迹。阅读手册页并进行实验;您会发现它非常值得。

您可能必须安装该包:sudo apt install mmv

答案3

或者,您可以使用类似这样的工具kid3-qt,它可以从 MP3 中读取 ID3 标签,并根据可供选择的多个不同标签创建自己的文件重命名规则。它可以一次性重命名整个目录中的 MP3 文件。

相关内容