命令 ls | grep 僅顯示目錄(當它還應該顯示檔案時)

命令 ls | grep 僅顯示目錄(當它還應該顯示檔案時)

在linux中,我有一個文件,其中包含許多包含文字“scrap”的文件和目錄。我可以透過打字ls *scrap*毫無問題地看到它們。然而,這也返回包含文字“scrap”的目錄,我想排除這些目錄。

我嘗試使用ls | grep ".*scrap.*"orls | grep scrap但只返回目錄(而不是普通文件)。

為什麼會這樣呢?

下一步將是(一旦代表返回正確的輸出)從該輸出中刪除目錄。也歡迎就如何做到這一點提出建議!

答案1

實際上,要最終列出當前目錄(第一級)中名稱中包含的所有常規文件scrap,您不需要ls+ grep

與老好find命令:

find . -maxdepth 1 -type f -name "*scrap*" -ls

答案2

當檔案名稱包含空格或(更糟糕的)換行符號時,ls您會遇到問題。grep但是使用安全的檔案名,您可以執行以下操作:

ls -l | grep -oP '^-.* \K.*$'
ls -l | sed -n '/^-/s/^.* //p'

但通常你應該使用該find方法。

答案3

scrap對於目前目錄中包含,的非目錄檔案的名稱zsh

print -rC1 -- *scrap*(ND^/)

請注意,在ls *scrap*(或更正確的ls -- *scrap*)中,如果任何*scrap*文件的類型為目錄,然後ls將列出他們的內容(帶有that-scrap-dir:標頭,除非*scrap*擴展為該目錄中的一個且僅一個檔案)。

如果您想要這種類型的文件目錄ls只是像其他類型的文件一樣列印它們的名稱,您需要添加選項-d

ls -d -- *scap*(D^/)

但是,使用它幾乎沒有任何意義,ls因為在呼叫時,按名稱和類型查找檔案的所有工作都已由 shell 完成ls,您不妨使用 shell 的內建printprintf

答案4

似乎就是您正在尋找的答案。這篇文章談到全球擴張是只顯示某些內容的原因。

相關內容