2010-02-05 35 views
4

假設我有包含文件如何告訴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 

,而不是我彷彿用tab完成

foo\ bar.txt foo\ baz.txt 

即正確轉義。

如何讓bash正確地逃避其輸出?

回答

4

你把引號放在你的變量中。這樣你保留空間。另外,不需要使用外部命令basename。外殼可以爲你做到這一點。 (假設你使用bash)

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

..添加丟失的終止報價 – falstro 2010-02-05 11:57:33

+0

thks。當你添加它時,我也在做它。 – ghostdog74 2010-02-05 11:58:36

2

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

> ls -al 
foo bar.txt 
foo baz.txt 

打開vim和執行:

:r!ls *.txt 

這將加載的文件,然後執行:

:%s/\(\(.*\)\.txt\)/mv "\1" "\2"/gc 

This will r與E將線:

mv "foo bar.txt" "foo bar" 
mv "foo baz.txt" "foo baz" 

突出顯示所有Ctrl-v下來,然後輸入:並鍵入此命令的其餘部分:

:'<,'>!bash 

這將在bash執行加亮的命令。退出vim並檢查您的目錄:

> ls 
foo bar 
foo baz 
+0

**或**在'vim'中輸入:':!for f in * .txt;做mv「$ {f}」「$ {f%.txt}」; (假設Bash是你的shell)。 – 2010-02-05 14:51:36