重命名带有空格的文件的bash错误-mv目标不是目录
Posted
技术标签:
【中文标题】重命名带有空格的文件的bash错误-mv目标不是目录【英文标题】:bash error renaming files with spaces - mv target is not a directory 【发布时间】:2014-12-18 14:27:23 【问题描述】:我正在尝试重命名一堆包含空格的文件,以消除空格。我以为我找到了正确的 bash 命令:
for f in *.txt; do mv \"$f\" $f/ /; done
但是,这会为每个文件提供错误“mv:目标不是目录”。如果我在命令中将 'mv' 替换为 'echo mv',它会为每个文件打印正确的 mv 命令,如果我单独键入这些 mv 命令中的任何一个,它们就会起作用。例如,如果我有 2 个文件,“a .txt”和“b .txt”,并运行上面的命令,我得到:
mv: target 'a.txt' is not a directory
mv: target 'b.txt' is not a directory
如果我输入命令:
for f in *.txt; do echo mv \"$f\" $f/ /; done
我明白了:
mv "a .txt" a.txt
mv "b .txt" b.txt
我找到了另一种方法,使用“重命名”,但我想知道为什么这不起作用。
【问题讨论】:
我想知道您如何在 .txt 之前放置空格,因为它不会接受。它会认为 .txt 不是目录 【参考方案1】:试试:
for f in *.txt; do mv "$f" "$f// /"; done
三点:
不应转义 shell 变量的引号。
一般来说,对 shell 变量的每个引用都用双引号引起来是个好主意。
$f/ /
仅删除第一次出现的空格。要删除所有空格,请使用$f// /
。
出了什么问题
$ touch a,b" .txt"
$ ls *.txt
a .txt b .txt
$ for f in *.txt; do mv \"$f\" $f/ /; done
mv: target `a.txt' is not a directory
mv: target `b.txt' is not a directory
表达式\"$f\"
的行为不像是双引号。它扩展为两个参数,例如"a
和.txt"
,其中双引号被视为普通字符,就像a
是普通字符一样。因为mv
有三个参数("a
和.txt"
和a.txt
),mv
认为您正试图将前两个参数移到第三个,而第三个必须是目录。由于第三个不是目录,因此会发出错误消息。
【讨论】:
有没有办法保留空格?仍然,重命名文件?我得到 mv: targetconvert $fullfilename -resize $new_width_height[0]x$new_width_height[1] $new_file_name
如果文件名包含空格,它们需要在双引号内。【参考方案2】:
因为这是谷歌搜索此错误时出现的第一件事,所以我想我会添加一点。
如果您有两个以上的参数并且最后一个结果不是目录,则会出现此错误。
这有效(当 output.txt 不存在时):
mv file1.txt output.txt
这不存在(如果 file2.txt 确实存在):
mv file1.txt file2.txt
在我的情况下,我正在做:mv prefix_* output_file_name
以确保下载的文件具有一致的名称,但目录中出现了另一个文件,导致“mv 目标不是目录”错误
【讨论】:
在这两种情况下,mv
之后您似乎都有 2 个参数......我错过了什么?
确实如此。我刚刚澄清说,在一种情况下该文件不存在,而在另一种情况下它确实存在。以上是关于重命名带有空格的文件的bash错误-mv目标不是目录的主要内容,如果未能解决你的问题,请参考以下文章