2011-04-15 70 views
3

是什麼下面兩者之間的區別:find命令和-name選項懷疑

find . -type f -name \*.bmp 
find . -type f -name *.bmp 

我已經測試過,他們都返回相同的結果,所以有什麼不同_deep inside_


添加了來自removed answer

所以這是爲了避免對特殊字符*****外殼擴展,只透過*作爲參數傳遞給find命令,讓它處理它。

但我的機器上,他們都好,都返回BMP文件和當前目錄下,僅舉幾例,結果如下圖所示,有些是爲了簡潔

./images/building_color.bmp 
./images/building_gray.bmp 
./images/car_gray.bmp 
./images/temple_color.bmp 
./images/boat_gray.bmp 
./images/tools_gray.bmp 
./images/temple_gray.bmp 
./images/tools_color.bmp 
./images/car_color.bmp 
./images/boat_color.bmp 

系統省略信息:

GNU的bash,版本4.1.5(1)-release(1486-PC-Linux的GNU)

的Linux sysabod-筆記本2.6.32-30-通用#59 Ubuntu的SMP週二3月1日21:30:21 UTC 2011 i686 GNU/Linux

+1

更好地運行它作爲'find。 -type f -name'* .bmp'以避免shell擴展和目錄上的錯誤。 – Wes 2011-04-15 05:14:37

回答

3

當您轉義星號(\*)時,星號本身作爲參數傳遞給find命令,並將通過find進行評估。如果您沒有轉義星號(*),那麼shell會對其進行評估並將其擴展爲與該模式匹配的文件名。

富勒例如,請考慮以下目錄結構:

./a.txt 
./b.bmp 
./c.bmp 
./dir/d.doc 
./dir/e.bmp 

當你執行

find . -type f -name *.bmp 

外殼擴展*.bmpb.bmp c.bmp。即可以真正執行將是命令:

find . -type f -name b.bmp c.bmp 

將找到b.bmpc.bmp但不dir/e.bmp

當你執行

find . -type f -name \*.bmp 

*.bmp直接傳遞,因爲它是findfind將遞歸通過當前目錄(.)及其所有子目錄(在本示例中僅爲dir),並將查找與該模式匹配的那些目錄中的所有文件。結果將是:b.bmp,c.bmp以及dir/e.bmp

+0

@ cd1,@ bmk 所以它是爲了避免特殊*字符的外殼擴展,只將*作爲參數傳遞給find命令並讓它處理它。 但是在我的機器上,它們都很好,都返回當前目錄下的bmp文件,僅舉幾例,結果如下,有些爲簡潔省略 ./images/building_color.bmp ./images/building_gray.bmp ./images/car_gray.bmp ./images/temple_color.bmp ./images/boat_gray.bmp ./images/tools_gray.bmp ./images/temple_gray.bmp ./ images/tools_color.bmp ./images/car_color.bmp ./images/boat_color.bmp – Tracy 2011-04-18 16:56:58

7

下面是它們的不同之處:第一個總是有效,第二個不是。至於爲什麼:在bash中,shell globs(通配符模式,包括*或?)被shell擴展爲與glob匹配的所有文件。但是,如果不存在這樣的文件,則該模式被單獨保留。

因此,如果您位於沒有bmp文件的目錄中,則這些命令的工作方式相同,因爲第一個文件被轉義並且bash無法在第二種情況下找到任何匹配的文件。

如果從包含只有一個這樣的文件的目錄跑出來,說foo.bmp,首先會發現在該子樹的所有bmp文件,而第二個將只找到名爲foo.bmp所有文件。如果在一個包含多個bmp文件的目錄中運行,我相信你會得到一個錯誤,因爲find不知道如何處理所有的文件名。

+0

感謝您的「然而,如果沒有這樣的文件存在,該模式是孤立的。」位! – 2012-11-02 09:44:48

2

的第一個命令:

find . -type f -name \*.bmp 

傳遞一個星號的find命令,並告訴它找到在與.BMP結束當前目錄下的所有文件。

第二個命令:

find . -type f -name *.bmp 

可以由殼來解決,例如:

find . -type f -name image1.bmp image2.bmp image3.bmp 

(這將是僅在當前目錄中的BMP文件)

find只會列出它們,而不是其他目錄下的當前以下的bmp文件。