bash 重命名带有空格的文件时出错 - mv 目标不是目录

2024-03-25

我正在尝试重命名一堆包含空格的文件,去掉空格。我以为我找到了正确的 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

I get:

mv "a .txt" a.txt
mv "b .txt" b.txt

我找到了另一种方法来做到这一点,使用“重命名”,但我想知道为什么这不起作用。


Try:

for f in *.txt; do mv "$f" "${f// /}"; done

三点:

  1. shell 变量周围的引号不应被转义。

  2. 一般来说,最好在每个对 shell 变量的引用周围加上双引号。

  3. ${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 and .txt",其中双引号被视为普通字符,就像a是一个正常的角色。因为有三个论据mv ("a and .txt" and a.txt), mv认为您正在尝试将前两个参数移至第三个,并且第三个参数必须是目录。由于第三个不是目录,因此它会发出错误消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash 重命名带有空格的文件时出错 - mv 目标不是目录 的相关文章

随机推荐