mv: 目标“XXX”不是目录

Jac*_*eck 4 bash shell-script mv

我正在尝试编写一个 bash 脚本,该脚本将遍历目录\n并将文​​件重命名为“Chapter1.mp3”、“Chapter2.mp3”(文件名真的很疯狂,任何人都无法识别它们是什么)等,\n但是当我这样做时,出现以下错误:

\n
mv: target \'Chapter##.mp3\' is not a directory\n
Run Code Online (Sandbox Code Playgroud)\n

我记得,mv命令允许您指定文件名和目录...为什么我会收到此错误?以下是我的代码:

\n
cptr=0;\n\nfor i in ./myFolder/*; do\n    cptr=$(($cptr+1)); # I can\'t remember, can I use cptr++?\n    mv -v $i "Chapter$cptr.mp3";\ndone;\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过删除文件扩展名,删除引号,甚至使用cp代替,但我尝试过的任何方法都不起作用。\xc2\xa0\n为什么它要求目标只能是目录而不是文件名?

\n

我正在使用带有适用于 Linux 的 Linux 子系统的 Ubuntu 20.04 LTS 终端;\n这有什么区别吗?

\n

Sco*_*ott 11

如果您的文件名中包含空格(或制表符或换行符),\n则需要$i引号引起来。\xc2\xa0\n如果,\xc2\xa0for\xc2\xa0例如,您的第 42 个文件名为foo\xc2\xa0bar,则

\n
mv -v $i "Chapter$cptr.mp3"\n
Run Code Online (Sandbox Code Playgroud)\n

将被扩展为

\n
mv -v ./myFolder/foo bar "Chapter42.mp3"\n
Run Code Online (Sandbox Code Playgroud)\n

看起来您\xe2\x80\x99正在使用mv三个名称参数运行。\xc2\xa0\nmv仅当姓氏是\xc2\xa0目录(例如\xc2\xa0)时,使用三个或更多名称参数运行才有效mv\xc2\xa0*.mp3\xc2\xa0my_music\ .\xc2\xa0\n因为您没有名为ChapterNN.mp3,\n您会收到\xc2\xa0 报告的\xc2\xa0 错误。

\n

也如此

\n
mv -v "$i" "Chapter$cptr.mp3"\n
Run Code Online (Sandbox Code Playgroud)\n

我说\xe2\x80\x9c如果你的文件名中有空格\xe2\x80\xa6,\n那么你需要加上$i引号。\xe2\x80\x9d\xc2\xa0\nOf\xc2\xa0当然我\ xc2\xa0 意味着 \xe2\x80\x9c 你应该$i引号括起来,\n这样你的脚本就会工作\nif\xc2\ xa0you有任何带有空格的文件名\xe2\x80\xa6。\xe2\x80\x9d

\n