我试图将某些字符插入到音乐文件中,以便在包含许多文件的目录中以某种方式重命名它们,因此手动执行此操作非常耗时,我想使用终端或 bash 脚本自动执行此过程。
由于这是一个音乐收藏,因此有许多文件,分布在许多目录中。
我尝试了一些“awk”、“重命名”和“sed”终端选项,但我似乎在终端中得到了非常疯狂的输出(可能是由于空格和或标点符号),我必须按 Ctrl+z 来停止工作或者它只是出错了。还尝试了“Krename”和“Easytag”,但没有成功。
例如我想改变:
Chicane - Behind the Sun - 01 Overture.mp3
到:
Chicane - Behind the Sun - 01 - Overture.mp3
因此,在第 31 列或位置处,我想添加“-”来更改文件名,但是此文件夹中还有 10 个文件,并且还有更多其他文件夹(专辑)我想更改,因此我想要的位置和字符添加的内容会有所不同。
我的 bash/脚本编写技能是 101,我已经使用压缩和其他简单任务管理了一些备份脚本,但这目前超出了我的能力范围,任何帮助将不胜感激。
我知道这是重复的,但我尝试了很多选择,但没有成功,但我正在学习,在您的帮助下,解决方案就在眼前,所以提前感谢您。
答案1
使用 Perl 重命名工具,
在前 30 个字符(或字节,我不知道它是否启用区域设置)后插入-
(破折号和空格):
rename 'substr($_, 30, 0) = "- "' *.mp3
-
在第一次出现两个数字和一个空格后添加:
rename 's/(\d\d )/$1- /' *.mp3
请注意,有两种不同的rename
命令,一种来自 Perl util-linux
,另一种来自 Perl。他们做不同的事情,请参阅:
答案2
处理带有空格的文件名需要find
和xargs
。读man find xargs
和
find . -type f -print0 | xargs -0 --no-run-if-empty someprogram ...
指示生成文件名列表,以 ASCII NUL (0x00) 字节分隔-print0
。find
NUL(和“ /
”)永远不会出现在文件名中。
xargs -0
告诉xargs
使用这样一个以零分隔的列表,并传递系统允许的尽可能多的文件名someprogram
,并将someprogram
一遍又一遍地调用,直到没有更多的文件名。
xargs --show-limits </dev/null
将显示这些限制。