2014-01-23 91 views
4

我在兩臺機器上使用CentOS 6.4 final。我正在執行一個腳本。 的腳本包含find命令找到:路徑必須在表達式前

path=$1 
searchstring=$2 
echo `find $path -name $searchString` 
for filename in `find $path -name $searchString` 
do 
echo "$filename" 
echo 
done 

./findfiles.sh /var/log/ *.txt 

上述腳本正在執行精細和打印文件。但是在第二臺機器我得到usage error: find: paths must precede expression

背後的原因是* .TXT它得到了在發現command.After的文件名改變 在find $path -name "$searchString" 它執行罰款擴大。

爲什麼在第一個CentOS機器中沒有發生語法錯誤?

+0

類似:http://stackoverflow.com/questions/6495501/find-paths-must-precede-expression-how-do-i-specify-a-recursive-search-that – trante

回答

7

引用你的shell參數:

$ ./findfiles.sh /var/log/ '*.txt' 
+1

Thanks Lutz! 我也一樣,工作正常。我仍然對機器的行爲感到困惑,這就是爲什麼我發佈它。 – Shriram

6

您需要使用適當的引用或shell將盡力擴大find看到它*.txt之前

因此,如果當前文件夾中包含a.txtb.txt,然後find /var/log -name a.txt b.txt將被執行 - >find會混淆你想b.txt

這就是爲什麼它如此重要,用正確的引用做什麼。你的腳本應該是:。!

path="$1" 
searchstring="$2" 
echo $(find "$path" -name "$searchString") 
for filename in $(find "$path" -name "$searchString") 
do 
    echo "$filename" 
    echo 
done 

請注意,我的報價變量賦值(否則,水珠擴張將在定義searchstring發生同樣的,當你使用變量

沒有引號$()如果你會在那裏添加引號,然後找到將返回單個「單詞」作爲結果。

總是更喜歡$()在舊的內聯eval與back-ticks。它更可靠, 。