Ls

如何列出沒有目錄的文件,並按名稱過濾(ls 選項)

  • July 30, 2018

我有一個名為uploads. 它包含一堆文件,加上一些子目錄,這些子目錄又包含文件。

有沒有辦法我可以(一步)執行以下操作:

  1. 僅列出根上傳目錄中的文件——我不想看到子文件夾名稱或其內容;

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

替換-print為以在文件上使用您喜歡的選項-exec ls -lG -- {} +執行。ls

上述所有命令都隱藏點文件(即名稱以 a 開頭的文件.)。如果要顯示它們,請傳遞-Als或在 zsh ( )中添加Dglob 限定符。ls uploads/^t_*(.D)使用find,您可以使用另一種方​​法使其僅遞歸一個級別(find不專門處理點文件)。find僅當您在目前目錄中執行時,這才完全有效。

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print

引用自:https://unix.stackexchange.com/questions/15950