mv:目标‘XXX’不是目录

mv:目标‘XXX’不是目录

我正在尝试编写一个 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;

出于某种原因,它不喜欢空格,尽管我使用了反斜杠来转义空格,所以它把事情搞乱了。我只是重命名了没有空格的文件夹,然后它就正常工作了。

相关内容