2013-04-08 31 views
0

我只需要在目錄中找到具有使用ls的擴展名的文件(不能使用find)。只使用ls找到帶擴展名的文件

我試過ls *。*,但是如果dir不包含任何擴展名的文件,它會返回「沒有這樣的文件或目錄」。

我不想要那個錯誤,並且想讓ls返回到cmd提示符,如果有擴展名的文件。

我試圖使用gre與ls來實現相同。

ls | grep「*。*」 - 不起作用 但是ls | grep「\」。作品。

我不知道爲什麼grep *。*不起作用。任何幫助表示讚賞!

謝謝!

+0

'ls | grep'\。'' – 2013-04-08 03:51:45

+0

是的,正如上面提到的那樣。你能解釋它爲什麼會這樣做,爲什麼\ *。\ *不會? – 2013-04-08 03:53:16

+1

'ls *。{mp3,exe,mp4}' 這個問題應該有所幫助:http:// stackoverflow。com/questions/1447625/list-files-with-certain-extensions-with-ls-and-grep – 2013-04-08 03:53:52

回答

1

理解shell模式和正則表達式之間的區別很重要。殼模式有點簡單,但不夠靈活。 grep使用正則表達式匹配。像

*.* 

甲殼圖案將與正則表達式來完成作爲

.*\..* 

但在grep的正則表達式不固定的,這意味着它搜索的匹配就行的任何地方,使兩個.*部件不必要。

2

我認爲正確的解決辦法是這樣的:

(shopt -s nullglob ; echo *.*) 

這是一個有點冗長,但它永遠是可行的,不管你有什麼樣時髦的文件名。 (帶管道lsgrep的問題是,典型的系統允許在文件名中確實離奇字符,包括,例如,換行。)

shopt -s nullglob部分啓用(「小號 ETS」)的nullglobSH ELL 選擇選項,它告訴Bash如果沒有文件的名稱匹配*.*,那麼*.*應該被刪除(即應該擴展爲無),而不是單獨放置。

圓括號(...)要設置子shell,所以nullglob選項僅對腳本的這一小部分啓用。

1

嘗試

ls -1 | grep "\." 

名單隻有具有擴展和無(空單)文件,如果沒有文件:喜歡你的需要。

使用Linux grep,您可以添加-v來獲取不帶擴展名的列表文件。