如何告诉bash正确转义扩展字符串?

如何告诉bash正确转义扩展字符串?,bash,escaping,Bash,Escaping,假设我有一个包含这些文件的目录 foo bar.txt foo baz.txt (每个在“o”和“b”之间都有一个空格)。假设我想这样做: for f in *.txt; do mv ${f} `basename ${f} .txt`; done 由于bash将*.txt扩展为 foo bar.txt foo baz.txt 而不是 foo\ bar.txt foo\ baz.txt i、 正确地转义,就好像我使用了制表符补全一样 如何让bash正确转义其输出?在变量中加引号。这样可

假设我有一个包含这些文件的目录

foo bar.txt  
foo baz.txt
(每个在“o”和“b”之间都有一个空格)。假设我想这样做:

for f in *.txt; do mv ${f} `basename ${f} .txt`; done
由于bash将
*.txt
扩展为

foo bar.txt foo baz.txt
而不是

foo\ bar.txt foo\ baz.txt
i、 正确地转义,就好像我使用了制表符补全一样


如何让bash正确转义其输出?

在变量中加引号。这样可以保留空间。此外,不需要使用外部命令
basename
。贝壳可以帮你。(假设您使用的是bash)


或者,如果是一次性操作,您可以使用vim:

> ls -al
foo bar.txt
foo baz.txt
打开vim并执行:

:r!ls *.txt
这将加载文件,然后执行:

:%s/\(\(.*\)\.txt\)/mv "\1" "\2"/gc
这将用以下内容替换线路:

mv "foo bar.txt" "foo bar"
mv "foo baz.txt" "foo baz"
按住Ctrl-v键突出显示所有,然后输入
,然后键入此命令的其余部分:

:'<,'>!bash

…添加了缺少的终止引号Ethks。当您添加它时,我也在这样做。或者在
vim
中键入:
:!对于*.txt中的f;执行mv“${f}”“${f%.txt}”;完成(假设Bash是您的shell)。
:'<,'>!bash
> ls
foo bar
foo baz