【发布时间】:2012-12-23 21:10:32
【问题描述】:
我正在编写一个 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 '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 中的代码正在运行(至少令人满意),仅在空格字符后找到一个字母,但问题在于替换。我尝试了许多不同的方法,结果都是焦点的第一个字母在这种情况下被交换为 A-Z。
在重命名手册页中,它说要将小写变为大写,您可以使用 's/a-z/A-Z/g',但很容易看出它仅在找到 a-z A-Z 时才适用。 所以这就是我需要帮助的地方。
如果有人知道如何像 sed 示例中那样执行此操作,那将是一个好处,其中 \
【问题讨论】:
-
我注意到你在你的帖子上一直“签字”。 Don't do that.
-
如果您已经有一个包含源名称和目标名称对的文本文件,那么您只需要
sed 's/^/mv /' textfile | sh(尽管用空格等引用文件名会使事情变得复杂;这只是一个概念证明,而不是一个实际的答案)。
标签: regex linux bash sed rename