如何列出沒有目錄的文件,並按名稱過濾(ls 選項)
我有一個名為
uploads
. 它包含一堆文件,加上一些子目錄,這些子目錄又包含文件。有沒有辦法我可以(一步)執行以下操作:
- 僅列出根上傳目錄中的文件——我不想看到子文件夾名稱或其內容;
和 2. 不要列出任何以
t_
我知道
-d
國旗,但它並沒有得到我想要的東西。
這聽起來像是一份工作
find
。
- 用於
-maxdepth
僅返回目前目錄,而不是在子文件夾中遞歸搜尋- 用於
-type f
僅返回文件而不是目錄或設備節點或其他任何東西- 如果
-not
和-name
避免使用您不想要的名稱的文件,請使用組合它可能會像這樣組合在一起:
find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
GNU ls(即非嵌入式 Linux 系統和 Cygwin 上的 ls 命令,在其他一些 unice 上也可用)可以根據文件名隱藏某些文件。不過,沒有辦法忽略目錄。
ls --hide='t_*' uploads
另一種方法是讓您的外殼進行匹配。Bash、ksh 和 zsh 有一個否定模式
!(t_*)
來匹配除了那些匹配的所有文件t*
;在 bash 中這個特性需要用 開啟shopt -s extglob
,而在 zsh 中它需要用setopt ksh_glob
. Zsh 也有等效的語法^t_*
,需要用setopt extended_glob
. 這仍然不會忽略目錄。Zsh 有一個額外的功能,它不僅可以通過名稱匹配文件,還可以通過元數據等來匹配文件:glob qualifiers。在匹配結束時添加(.)
以限制為正常文件。否定^
是名稱匹配語法的一部分,因此^t_*(.)
表示“所有不匹配的正常文件t_*
”而不是“所有不匹配的正常文件t_*
”。setopt extended_glob # put this in your ~/.zshrc ls uploads/^t_*(.)
如果您發現自己沒有高級工具,您可以在任何帶有
find
. 這不是您通常在命令行上鍵入的那種東西,但它功能強大且精確。Caleb 已經展示瞭如何使用 GNU find 來做到這一點。該-maxdepth
選項不可移植;您可以-prune
改為使用可移植地停止find
遞歸。find uploads/* -type d -prune -o \! -type f -name 't_*' -print
替換
-exec ls -lG -- {} +
執行。ls
上述所有命令都隱藏點文件(即名稱以 a 開頭的文件
.
)。如果要顯示它們,請傳遞-A
給ls
或在 zsh ( )中添加D
glob 限定符。ls uploads/^t_*(.D)
使用find
,您可以使用另一種方法使其僅遞歸一個級別(find
不專門處理點文件)。find
僅當您在目前目錄中執行時,這才完全有效。cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print