![尝试使用标准工具重命名批量文件夹](https://linux22.com/image/206552/%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%E6%A0%87%E5%87%86%E5%B7%A5%E5%85%B7%E9%87%8D%E5%91%BD%E5%90%8D%E6%89%B9%E9%87%8F%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我正在尝试批量重命名许多文件夹,但由于某种原因我的方法似乎不起作用。我正在尝试使用以下脚本,但它什么也没做。我是编程新手,所以任何建议都会受到赞赏。这些是我的文件夹名称。
test.custom.tmp untitledfolder.custom.tmp wis.custom.tmp
我需要将它们重命名为
test untitledfolder wis
我正在使用以下脚本,但它什么也没做。
while read line; do
newname=$(echo "$line" | cut -f 1 -d '_')
mv $line newname;
done < read
在这里,我创建了一个名为 read 的文件,其中包含所有需要重命名的文件夹名称。
这个脚本有什么问题,还有更好的方法来完成这个任务吗?谢谢。
答案1
一个简单的方法是:
$ for d in *.custom.tmp/; do
echo mv -- "$d" "${d%%.*}"
done
mv -- test.custom.tmp/ test
mv -- untitledfolder.custom.tmp/ untitledfolder
mv -- wis.custom.tmp/ wis
一旦确定这是您想要的结果,请删除echo
.
这${d%%.*}
是一个参数扩展,准确地说:
${参数%字}
${参数%%字}
该单词被扩展以产生模式并根据下面描述的规则进行匹配(请参阅模式匹配)。如果模式与参数扩展值的尾部部分匹配,则扩展的结果是具有最短匹配模式(“%”情况)或最长匹配模式(“%%”情况)的参数值已删除。
在本例中,它以字符串为例test.custom.tmp
,并删除第一个之后的所有内容.
。
答案2
如果你想保持你的方法,你可以这样做:
while read line; do
newname=$(echo "$line" | cut -f 1 -d '.');
mv $line $newname;
done < read
请记住,您的分隔符是一个点 ( -d '.'
),并且也将 用作$newname
变量,而不是字符串。
这可以纠正您的脚本错误,但为了更好的方法,您可以使用@schrodingerscatcuriosity 答案。