如何在终端或脚本的特定位置将字符插入到许多具有空格和/或标点符号的文件名中

如何在终端或脚本的特定位置将字符插入到许多具有空格和/或标点符号的文件名中

我试图将某些字符插入到音乐文件中,以便在包含许多文件的目录中以某种方式重命名它们,因此手动执行此操作非常耗时,我想使用终端或 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

处理带有空格的文件名需要findxargs。读man find xargs

find . -type f -print0 | xargs -0 --no-run-if-empty someprogram ...

指示生成文件名列表,以 ASCII NUL (0x00) 字节分隔-print0findNUL(和“ /”)永远不会出现在文件名中。

xargs -0告诉xargs使用这样一个以零分隔的列表,并传递系统允许的尽可能多的文件名someprogram,并将someprogram一遍又一遍地调用,直到没有更多的文件名。

xargs --show-limits </dev/null将显示这些限制。

相关内容