ls:只有一個符合模式時顯示目錄名稱

ls:只有一個符合模式時顯示目錄名稱

當用於ls顯示與某個模式匹配的文件時,如果有多個匹配,則顯示目錄名稱及其內容,但如果只有一個匹配,則省略目錄名稱。這是一個例子:

example % ls
bar     barbados    foo

example % ls b*
bar:
1   2

barbados:
1   2

example % ls f*
1   2

在範例中,請求以b*符合兩個目錄開頭的所有文件,輸出顯示兩個目錄的名稱及其內容。

當我請求f*輸出時,顯示單一符合目錄的內容,但省略目錄名稱。

如何配置ls在只符合單一目錄的情況下顯示符合目錄的名稱?

答案1

可能的解決方法可能是包裝函數:

dls() {
    if [ "$#" -eq 1 ] && [ -d "$1" ]; then
        printf '%s:\n' "$1"
    fi
    ls -- "$@"
}
  • 上面的函數不接受任何選項作為參數傳遞
  • 它只是檢查是否:
    1. 只有一個參數
    2. 參數是一個目錄

如果這兩個條件成立,則在列出目錄內容之前列印目錄名稱。


% dls f*
foo:
1   2

在某些printf實作中,您可以將目錄名稱替換為 ,%s以與最新版本的 GNU在包含空格或其他特殊字元時%q類似的方式引用目錄名稱。ls

答案2

使用您的範例,當您執行 時ls b*,shell 會將 展開b*bar barbados,因此您實際上執行了ls bar barbados。當ls有多個參數時,如果其中任何一個是目錄,它將列印名稱,後跟目錄中的檔案清單。

當您執行時ls f*,shell 會將 展開f*foo,因此您實際上運行了ls foo。當ls只有一個參數時,如果該參數是目錄,則列印目錄中的檔案清單(不含目錄名稱)。

沒有什麼我所說的「好」方法可以做ls你想做的事(至少據我所知,其他人可能知道得更好)。一種「不太好的」方法是包含一個您知道永遠不會存在的附加參數,然後過濾與該不存在的檔案相關的錯誤輸出。我會記錄下來,解析 的輸出ls是一個壞主意,但我會給你這個以防萬一它有幫助:

$ function dls() {
    if [[ $# -eq 0 ]]; then
        ls
    else
        ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
    fi
}

$ dls
foo

$ dls f*
foo:
1  2

這樣做可能會產生意想不到的後果(例如,您可能無法像通常那樣重定向標準錯誤訊息)。

答案3

使用-al大多數人每次都會使用的參數。ls然後不會這樣做,直到您在目錄名稱中添加尾部斜杠。另一個參數是-d,那麼它就不會以任何方式下降。

如果您希望它永久存在,請將以下內容放入.bashrc您的主目錄中:

alias lsd='ls -d' ;

lsd您可以在以後使用該命令。

相關內容