2015-05-28 71 views
6

使用ls –agrep,您將如何列出/ usr中所有文件的名稱,以字母p或字母r或字母s開頭,使用單個grep命令?使用grep和ls -a命令

這是正確的嗎?

ls –a | grep [prs] /usr 
+0

直接在'/ usr'下或'/ usr'下的任何級別? –

+0

直接在/ usr –

+0

'echo/usr/[prs] *'... – twalberg

回答

4

如果你想找到的文件,不要使用ls。使用find命令。

find /usr -name '[prs]*' 

如果你不希望搜索在/ usr整個樹,這樣做:

find /usr -maxdepth 1 -name '[prs]*' 
+0

她列出了文件,找不到它們(我懷疑這是一個作業問題)。 – Kusalananda

0

我倒是ls的目錄,然後才應用grep。此外,你錯過了^字符過濾出以這些字母開頭文件:

$ ls -a /usr | grep ^[prs] 
+0

非常感謝您的洞察力! –

0

爲什麼不

find /usr -type f -name '[prs]*' 
+1

因爲那會遍歷'/ usr'下的所有內容,而不僅僅是'/ usr'本身。 – Kusalananda

+0

這很容易用'-maxdepth'參數修復。它肯定比解析'ls'更安全。 –

3
ls -a /usr | grep '^[prs]' 

將從中ls -a /usr輸出選擇(這是由換行符分隔的/usr中的文件列表)以prs個字符。

這可能是您的老師所期待的,但這是錯誤的或至少不可靠的。

文件名可以由多行組成,因爲換行符與Linux或任何UNIX上的文件名中的任何字符一樣有效。因此該命令不會返回名稱以p,qs開頭的文件,而是返回以p,qs開頭的文件名的行。通常,您不能可靠地後處理ls的輸出。

-a是要包含隱藏文件,即名稱以.開頭的文件。由於您只希望以pqs開頭的那些,這是多餘的。

需要注意的是:

ls /usr | grep ^[pqs] 

會更加錯誤的。第一個^是Bourne shell,rceszsh -o extendedglob(儘管在bash或其他POSIX shell中正常)的幾個shell中的特殊字符。

然後,在大多數shell(fish是一個顯着的例外)中,[pqs]是一個通配符運算符。這意味着^[qps]應該被shell擴展到匹配該模式的文件列表(相對於當前目錄)。

bash那些炮彈不把 ^特別,如果有一個在當前目錄下名爲 ^p文件

那麼,這將成爲

ls /usr | grep ^p 

如果沒有匹配的文件,在cshtcshzshbash -O failglob,您將收到一條錯誤消息,該命令將被取消。在zsh -o extendedglob其中^是通配符運算符,^[pqs]意味着任何文件,但是p,qs

2

@twalberg的評論非常適合您提出的選項。 echo會忽略隱藏的文件,但只有當您希望以[prs]開頭的文件時纔會對其進行過濾。
當您需要其他過濾器的隱藏文件時,類似的解決方案將是ls -ad /usr/[prs]*,其中-d選項禁止列出子目錄。
該解決方案還將顯示完整路徑,當您首先轉到目錄時可以抑制該路徑。當你想留在當前目錄中時,使用它的子shell。當/ usr目錄不存在時,我使用& &跳過ls。

(cd /usr && ls -ad [prs]*)