2014-01-17 25 views
0

通常,它建議使用查找/富/酒吧*,而不是查找/ -name foo的 「欄*」

find /foo -name "bar*" 

找到所有文件/foo開始bar。是不是更簡單易用

find /foo/bar* 

?我知道bash在最後一個例子中擴展了/foo/bar*,而不是find本身,但是是否存在任何風險?

我的用例是我想將命令存儲到變量中,例如find

FINDSTRING='/foo -name "bar*"' 
FILES=`find $FINDSTRING` 

不工作,或

FINDSTRING='/foo -name bar*' 
FILES=`find $FINDSTRING` 

其是否有bar*文件在當前目錄中不工作,但

FINDSTRING='/foo/bar*' 
FILES=`find $FINDSTRING` 

確實工作。

+0

所有這三個你給跟隨陋習,不可靠地工作的例子 - 嘗試的情況下,你有文件名用空格,或者更糟的是,一個文件名稱如'foo * bar.txt'。請參閱http://mywiki.wooledge.org/BashPitfalls中的條目#1 –

回答

0
FINDSTRING='/foo -name bar*' 
FILES=`find $FINDSTRING` 

在這個例子中,bash正在擴大,而不是find通配符(*)。 find所以試圖評估文件列表作爲名稱模式文件。因此,它不工作...

否則,-name選項允許我們使用的名稱的文件的具體模式是這樣的例子:

sudo find/-name "[0-9]*" 
0

如果有一個不工作在當前目錄欄*文件,但

您可以通過防止猛砸在FINDSTRING擴大*,通過使用自變量用單引號解決這個問題:

FINDSTRING="/foo -name 'bar*'" 

不要讓猛砸做擴展(如果你這樣做,有什麼用find,因爲在所有的Bash將已經生成匹配的文件列表中的點?)

2

而不是存儲整個find命令在一個變量考慮變量存儲路徑和glob模式是這樣的:

find "$fpath" -name "$fname" 

fpath='/foo' 
fname='bar*' 

然後爲運行find命令

4

使用數組存儲選項命令,而不是一個扁帶:

find_options=(/foo -name "bar*") 
files=$(find "${find_options[@]}") 

存在與努力的文件列表存儲在一個字符串,如果這些文件名包含空格等問題,但這是一個另一個問題是重要的。

0

find /foo/bar*只搜索以/ foo目錄頂層的「bar」開頭的文件名。例如,如果存在/foo/quux/bar.txt,則find /foo -name "bar*"將找到它,但find /foo/bar*不會。

現在,至於將命令存儲在一個變量中,簡短的答案是,你不能(至少在一個普通的變量)。有些選項可以做類似於將其存儲在變量中的選項,但是您應該使用哪一個取決於您想要將它存儲在變量中的爲什麼BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!涵蓋了這個,但這裏是簡短的總結。

  • 如果你沒有一個很好的理由在一個變量存儲命令執行前,然後就。存儲&檢索命令可能很麻煩,如果沒有足夠的理由,只需跳過整個混亂並直接執行命令即可。

  • 如果您需要動態地建立了命令,你可以存儲的命令(或只是其參數)在一個數組(如chepner建議):

    find_options=(/foo -name "bar*") 
    files="$(find "${find_options[@]}")" 
    

    而作爲chepner還指出,這將如果文件名中有空格,則失敗。你真的應該將文件名存儲爲一個數組,以及:

    find_options=(/foo -name "bar*") 
    
    files=() 
    while IFS= read -r -d '' file; do 
        files+=("file") 
    done < <(find "${find_options[@]}") 
    
    dostuffwith "${files[@]}" 
    

    (見BashFAQ #20: How can I find and safely handle file names containing newlines, spaces or both?

  • 如果你只是想重複使用命令不用每次都寫出來,你可以命令成一個函數:

    find_bar() { 
        find /foo -name "bar*" 
    } 
    
    files=() 
    while IFS= read -r -d '' file; do 
        files+=("file") 
    done < <(find_bar) 
    
    dostuffwith "${files[@]}" 
    
相關問題