我从我的 iPod 中提取了歌曲,但这样做时,每首歌曲都被重命名为“- [歌曲的原始名称]”。我想编写一个 bash 脚本来删除第一个“-”,因为其中可能有 1000 首歌曲,而我无法手动重命名它们。我尝试使用 mv 和重命名来完成此操作,但由于特殊字符而无法工作。我在互联网上查了一下,找到了一个解决方案,即用“”替换“-”,但问题是我只想删除第一个“-”,而不是我歌曲中可能出现的其他潜在的“-”姓名。我希望我说得足够清楚,有人可以帮助我吗?
这是我的原始脚本:
#!/bin/bash
for f in *; do
echo "${f}";
if [[ ${f:0:1} == "-" ]]; then
echo "renaming ${f}";
rename.ul ${f} ${f:1} *.mp3;
fi
done
答案1
for f in -*.mp3; do
echo mv -- "$f" "${f:1}"
done
当您确定它执行您想要的操作时,请删除echo
.
--
需要使用双破折号 ( ) 来阻止将文件名中的mv
解释-
为选项。对于文件名包含空格的情况,需要引用变量。
答案2
当您将一个以破折号开头的参数传递给命令时,并且您不希望该参数被解释为选项,请--
首先将(双破折号)作为参数传递。对于几乎所有命令,--
都意味着“此后没有更多选项”。
rename.ul -- '-' '' -*
另一种可能性是安排参数不以破折号开头。这并不总是可能的,但对于文件名来说,它是:添加./
在前面。
rename.ul ./- ./ ./-*
请注意,您不需要循环 - rename
对文件列表作为参数感到满意。此外,您不需要传递整个文件名,只需传递要重命名的部分即可。 (事实上,脚本的问题之一是您将内容混合在一起,将整个文件名作为字符串传递以进行替换,然后每次传递所有文件的列表。)
还总是在变量替换两边加上双引号,否则您的脚本将无法处理包含空格的文件名。