2011-04-01 60 views
3

我想在shell腳本中使用find來計算我匹配通配符模式的文件數,然後獲取文件的名稱(如果只有一個)。但我無法通過擴展模式來解決通配符問題。如何將shell通配符傳遞到反引號命令

FINDCMD="find . -iname *DATA*.txt" 
DATACOUNT=$($FINDCMD | wc -l) 

if [ $DATACOUNT -eq 1 ] 
then 
    use-data $($FINDCMD) 
else 
    echo bugger 
fi 

這並不工作:外殼在調用find時擴大DATA .TXT。我想要星號通過查找。

如果我讓

FINDCMD="find . -iname '*DATA*.txt'" 

然後shell不擴展星號,卻發現得到的單引號和比賽無關。

回答

1

不要把你的命令放在一個變量中。直接執行命令有什麼問題?

DATACOUNT=$(find . -iname "*DATA*.txt" | wc -l) 
if [ $DATACOUNT -eq 1 ];then 
    ..... 
fi 

編輯:

,如果你婉重用命令,使用子程序

myfind(){ 
    find . -iname "*DATA*.txt" | wc -l 
} 
+0

因爲我想重複使用相同的命令來獲取文件名,如果只有一個。更好的可維護性只能在一個地方定義命令。但是,如果我必須這樣做,我可以像你所建議的那樣做。必須有更好的辦法.. – blueshift 2011-04-01 08:38:55

-1

開關的單引號和雙引號。

嘗試:

FINDCMD='find . -iname "*DATA*.txt"' 
+0

你試過這個嗎?這似乎根本沒有幫助。一無所獲。 – blueshift 2011-04-12 09:02:19

+0

我嘗試了兩種方法,他們似乎也很不幸地採取了相同的行動。他們不匹配任何文件, – sureshvv 2011-04-13 18:23:29

1

一舉兩得以下的:

  1. 使用引號find命令:FINDCMD="find . -iname \"*DATA*.txt\""FINDCMD='find . -iname "*DATA*.txt"'
  2. 使用以下的bash選項:-f Disable pathname expansion.中的開頭如下set -f腳本

這應該做的伎倆。雖然沒有在你的腳本上測試過,但你應該從這一點得到想法。

相關問題