在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 的內建print
或printf
。
答案4
似乎這就是您正在尋找的答案。這篇文章談到全球擴張是只顯示某些內容的原因。