我正在编写一个Bash脚本来清理我的音乐文件。
我希望它能格式化所有文件名,并使它们更加规范化,因此通过一些互联网搜索,我编写了以下代码:
sed -i -e 's/[-_]/ /g' -e 's/ \+/ /g' -e **'s/\<[a-z]/\U&/g'** -e "s/$artist //g" -e "s/$album //g"
我曾经使用文本文件添加文件名,然后使用sed命令,但是我不知道如何将新的名称应用到文件上。
后来,我开始尝试使用rename命令,并成功地获得了完全相同的结果,唯独粗体部分未能实现,这部分应该是让每个单词的首字母大写。
rename 's/[-_]/ /g' * && rename 's/\s+/ /g' * && **rename 's/\s\w{1}/*A-Z*/g' *** && rename 's/^\d+[[:punct:]]\s//g' * && rename "s/$artist\s//g" * && rename "s/$album\s//g" * && rename "s/($ext)//g" *
现在,rename中的代码已经可以工作(至少是令人满意的),仅在SPACE字符后找到一个字母,但是替换却存在问题。我尝试了许多不同的方法,结果都是将焦点中的第一个字母交换成了这种情况下的A-Z。
在重命名手册页面上,它说要使小写大写,你需要使用's/a-z/A-Z/g',但很容易发现它只适用于找到a-z A-Z的情况。所以这就是我需要帮助的地方。
如果有人知道如何像sed示例那样进行操作,那就更好了。其中\<匹配每个单词的开头,因为目前我的rename命令不会应用于第一个单词,也不会应用于看起来像“Disc name [Disc 1]”的多个光盘,因为这是显而易见的原因。
sed 's/^/mv /' textfile | sh
就足够了(尽管引用具有空格等特殊符号的文件名会使事情变得更加复杂;这只是一个概念证明,不是实际答案)。 - tripleee