我正在尝试编写一个 bash 脚本,它将遍历目录并将文件(文件名非常疯狂并且无法被人类识别)重命名为“Chapter1.mp3”,“Chapter2.mp3”等,但是当我执行此操作时,出现以下错误:
mv: target 'Chapter##.mp3' is not a directory
我记得,该mv
命令允许您指定文件名以及目录...为什么我会收到此错误?以下是我的代码:
cptr=0;
for i in ./myFolder/*; do
cptr=$(($cptr+1)); # I can't remember, can I use cptr++?
mv -v $i "Chapter$cptr.mp3";
done;
我尝试过删除文件扩展名、删除引号,甚至使用命令cp
,但都没有效果。为什么要求目标只能是目录而不是文件名?
我正在使用带有 Linux 子系统的 Ubuntu 20.04 LTS 终端;这有什么区别吗?
答案1
如果你的文件名中有空格(或制表符或换行符),那么你需要放在$i
引号中。例如,如果你的第 42 个文件名为foo bar
,那么
mv -v $i "Chapter$cptr.mp3"
将扩展为
mv -v ./myFolder/foo bar "Chapter42.mp3"
看起来您正在mv
使用三个 name 参数运行。mv
仅当最后一个名称是目录(例如)时,使用三个或更多 name 参数运行才有效 mv *.mp3 my_music
。由于您没有名为 的目录,因此您会收到报告的错误。ChapterNN.mp3
所以
mv -v "$i" "Chapter$cptr.mp3"
我说:“如果你的文件名中有空格……那么你需要加上$i
引号。”当然我的意思是“你应该加上$i
引号,这样你的脚本就可以工作了曾经文件名中含有空格…”。
答案2
笔记: 这个答案可以行得通,但不是一个好的解决方案。请参阅下面的评论和我选择作为解决方案的答案,它比我的解决方案好得多。
我在做
for i in ./my\ folder/*; do
...
done;
代替
for i in ./my_folder/*; do
...
done;
出于某种原因,它不喜欢空格,尽管我使用了反斜杠来转义空格,所以它把事情搞乱了。我只是重命名了没有空格的文件夹,然后它就正常工作了。