Shell

為什麼 find 在前面有星號(*)時沒有列出匹配的文件?

  • June 29, 2016

Ubuntu 14.04, 64 bit,我已設置/lib/modules/4.2.0-27-generic/kernel/drivers為我的目前目錄。我打算搜尋所有net作為子字元串存在的文件。如果我使用 regex 進行搜尋*net*,則只./net返回目錄作為搜尋結果。但是,如果我指定確切的文件名,那麼它只會列出相關文件(沒用,因為我並不總是知道要交叉檢查的確切文件名)。

$ find . -name *net* 
./net
$ find . -name *usbnet* 
./net/usb/usbnet.ko
$ pwd
/lib/modules/4.2.0-27-generic/kernel/drivers

我犯了什麼錯誤?

因為當您只使用*net*(沒有任何引用或轉義)時,它會在命令執行net之前被 shell 擴展為目前目錄中的(現有)文件/目錄。find所以命令變成:

find . -name net

如您所見,它只是匹配net,因此usbnet.ko不會匹配。

另請注意,如果沒有引用和轉義,如果模式不匹配(並且nullglobfailglob選項被禁用),則將其視為is。例如,對於find . -name *net*,如果目前目錄中沒有文件名包含net,則模式 find 得到的是*net*.


所以要解決這個問題,你需要避免 shell globbing,為此你可以使用引用或轉義 glob 模式:

find . -name '*net*' 
find . -name "*net*" 
find . -name \*net\* 

引用自:https://unix.stackexchange.com/questions/292784