我想将此目录结构更改为其后的目录结构。尽管还存在另一个目录批量重命名问题,但这个问题完全不同。
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 -iE
,E
不再将其解析为指示扩展正则表达式语法的标志 - 这会破坏您的捕获分组。
如果你想通过使用 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 文件。