使用ls –a
和grep
,您將如何列出/ usr中所有文件的名稱,以字母p或字母r或字母s開頭,使用單個grep命令?使用grep和ls -a命令
這是正確的嗎?
ls –a | grep [prs] /usr
使用ls –a
和grep
,您將如何列出/ usr中所有文件的名稱,以字母p或字母r或字母s開頭,使用單個grep命令?使用grep和ls -a命令
這是正確的嗎?
ls –a | grep [prs] /usr
如果你想找到的文件,不要使用ls
。使用find
命令。
find /usr -name '[prs]*'
如果你不希望搜索在/ usr整個樹,這樣做:
find /usr -maxdepth 1 -name '[prs]*'
她列出了文件,找不到它們(我懷疑這是一個作業問題)。 – Kusalananda
我倒是ls
的目錄,然後才應用grep
。此外,你錯過了^
字符過濾出以這些字母開頭文件:
$ ls -a /usr | grep ^[prs]
非常感謝您的洞察力! –
爲什麼不
find /usr -type f -name '[prs]*'
因爲那會遍歷'/ usr'下的所有內容,而不僅僅是'/ usr'本身。 – Kusalananda
這很容易用'-maxdepth'參數修復。它肯定比解析'ls'更安全。 –
ls -a /usr | grep '^[prs]'
將從中ls -a /usr
輸出選擇(這是由換行符分隔的/usr
中的文件列表)以p
,r
或s
個字符。
這可能是您的老師所期待的,但這是錯誤的或至少不可靠的。
文件名可以由多行組成,因爲換行符與Linux或任何UNIX上的文件名中的任何字符一樣有效。因此該命令不會返回名稱以p
,q
或s
開頭的文件,而是返回以p
,q
或s
開頭的文件名的行。通常,您不能可靠地後處理ls
的輸出。
-a
是要包含隱藏文件,即名稱以.
開頭的文件。由於您只希望以p
,q
或s
開頭的那些,這是多餘的。
需要注意的是:
ls /usr | grep ^[pqs]
會更加錯誤的。第一個^
是Bourne shell,rc
,es
或zsh -o extendedglob
(儘管在bash
或其他POSIX shell中正常)的幾個shell中的特殊字符。
然後,在大多數shell(fish
是一個顯着的例外)中,[pqs]
是一個通配符運算符。這意味着^[qps]
應該被shell擴展到匹配該模式的文件列表(相對於當前目錄)。
bash
那些炮彈不把
^
特別,如果有一個在當前目錄下名爲
^p
文件
那麼,這將成爲
ls /usr | grep ^p
如果沒有匹配的文件,在csh
,tcsh
,zsh
或bash -O failglob
,您將收到一條錯誤消息,該命令將被取消。在zsh -o extendedglob
其中^
是通配符運算符,^[pqs]
意味着任何文件,但是p
,q
或s
。
@twalberg的評論非常適合您提出的選項。 echo會忽略隱藏的文件,但只有當您希望以[prs]開頭的文件時纔會對其進行過濾。
當您需要其他過濾器的隱藏文件時,類似的解決方案將是ls -ad /usr/[prs]*
,其中-d選項禁止列出子目錄。
該解決方案還將顯示完整路徑,當您首先轉到目錄時可以抑制該路徑。當你想留在當前目錄中時,使用它的子shell。當/ usr目錄不存在時,我使用& &跳過ls。
(cd /usr && ls -ad [prs]*)
直接在'/ usr'下或'/ usr'下的任何級別? –
直接在/ usr –
'echo/usr/[prs] *'... – twalberg