假设我有一个包含文件的目录
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正确地逃避其输出?
答案 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