我正在尝试重命名一堆包含空格的文件,去掉空格。我以为我找到了正确的 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
三点:
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
and .txt"
,其中双引号被视为普通字符,就像a
是一个正常的角色。因为有三个论据mv
("a
and .txt"
and a.txt
), mv
认为您正在尝试将前两个参数移至第三个,并且第三个参数必须是目录。由于第三个不是目录,因此它会发出错误消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)