2013-02-05 37 views
3

我想列出名稱中只包含大寫字母的目錄中的所有條目。目錄需要附加「/」。使用grep列出目錄中的一個目錄

#!/bin/bash 
cd ~/testfiles/ 
ls | grep -r *.* 

由於grep的默認查找大寫字母只(右?),我只是通過遞歸目錄搜索下testfiles對於誰只包含大寫字母的所有名稱。

不幸的是,這是行不通的。

至於追加目錄,我不知道爲什麼我需要這樣做。有沒有人知道我可以從哪裏開始詳細解釋我可以用grep做什麼?此外如何解決我的問題?

+1

一個好的起點是男人grep: -/ – JohnTortugo

+0

我有,但它真的沒有給我太多的工作。在這個我會承認,我是一個新手,所以我不太確定我應該用什麼搜索字符串。 D: – user2001465

回答

1

不,grep的並不只考慮大寫字母。

你的問題我有點不清楚,例如:

  • 從-r選項的使用,看來你要遞歸搜索,但是你別這麼說。爲了簡單起見,我假設你不需要;如果你需要遞歸,考慮尋找@ twm的答案。
  • 您只想查找大寫字母(字母)。這是否意味着你不想接受任何其他(非字母)字符,但它們對於文件名(例如數字或破折號,點等)有效直至
  • 因爲你不說它我不是允許只在每行的文件上,我假設它是好的(因此使用ls -1)。

天真的解決辦法是:

ls -1 | grep "^[[:upper:]]\+$" 

也就是說,打印只包含大寫字母的所有行。在這種打印,例如我的TEMP目錄:

ALLBIG 
LCFEM 
WPDNSE 

然而,這將排除像README.TXTFILE001文件,這取決於你的要求(見上文)應該最有可能被包括在內。

因此,更好的解決方案將是:

ls -1 | grep -v "[[:lower:]]\+" 

即,打印不含有小寫字母的所有行。在打印例如我的TEMP目錄:

ALLBIG 
ALLBIG-01.TXT 
ALLBIG005.TXT 
CRX_75DAF8CB7768 
LCFEM 
WPDNSE 
~DFA0214428CD719AF6.TMP 

最後,爲了「正確標註」後面有個「/」,你可以使用-F(或--classify)選項目錄。

ls -1F | grep -v "[[:lower:]]\+" 

再次,例如輸出:

ALLBIG 
ALLBIG-01.TXT 
ALLBIG005.TXT 
CRX_75DAF8CB7768 
LCFEM/ 
WPDNSE/ 
~DFA0214428CD719AF6.TMP 

注不同的選擇將是使用find,如果你可以用不同的輸出(例如find ! -regex ".*[a-z].*")居住,但將有一個不同的輸出。

+0

嗨Christain.K - 我喜歡你的答案,謝謝。這說得通。 -1設置究竟做了什麼? – user2001465

+0

嗯我不知道如果我做錯了什麼,但你的答案不起作用,它也打印小寫文本。 – user2001465

+0

有可能是錯的 - 我現在不是個人電腦,明天我會檢查它。 –

0

確切的正則表達式取決於您的ls命令的輸出格式。假設你不使用ls命令的別名,你可以試試這個:

ls -R | grep -o -w "[A-Z]*" 

注意,與-R在LS,你會遞歸列出當前目錄下的目錄和文件。 grep選項-o告訴grep只打印文本的匹配部分。 -w選項告訴grep只考慮整個單詞的匹配。 "[A-Z]*"是一個正則表達式來過濾只有大寫的單詞。

請注意,該正則表達式將打印TEST.txt以及TEXT.TXT。換句話說,它只會考慮由字母組成的名字。

0

它是ls其中列出了文件,而不是grep,所以這是你需要指定你想要「/」追加到目錄。使用ls --classify將「/」追加到目錄中。

grep用於處理來自ls(或其他來源,一般來說)的結果,只顯示與您指定的模式相匹配的行。它不限於大寫字符。您可以將其限制爲只包含大寫字符和「/」(grep -E '^[A-Z/]*$),或者如果您還需要數字,句點等,則可以用grep -v -E [a-z]過濾掉包含小寫字符的行。

由於grep不是列出文件的程序,它不是你想要執行遞歸的地方。如果您使用ls -R,則ls可遞歸列出路徑。但是,您只需要以這種方式獲取文件路徑的最後一個組件。

您可能想要考慮使用find來處理遞歸。這個工作對我來說:

find . -exec ls -d --classify {} \; | egrep -v '[a-z][^/]*/?$'

我要指出,使用ls --classify追加「/」到目錄的結尾一些其他人物也可以附加到其他類型的,它可以分類路徑。例如,它可能會將「*」附加到可執行文件的末尾。如果這不是好的,但你可以單獨列出目錄和其他路徑,這可以通過運行find兩次來解決 - 一次用於目錄,然後再用於其他路徑。這個工作對我來說:

find . -type d | egrep -v '[a-z][^/]*$' | sed -e 's#$#/#'

find . -not -type d | egrep -v '[a-z][^/]*$'