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

时间:2010-02-05 11:51:51

标签: 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

即。正确逃脱,好像我已经使用了标签完成。

如何让bash正确地逃避其输出?

2 个答案:

答案 0 :(得分:4)

你在变量中加上引号。这样你就可以保留空间。此外,无需使用外部命令basename。 shell可以为你做到这一点。 (假设您正在使用bash)

for file in *.txt
do
 mv "$file" "${file%.txt}"
done

答案 1 :(得分:2)

如果是一次性操作,您可以使用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

这将在bash中执行突出显示的命令。退出vim并检查你的目录:

> ls
foo bar
foo baz