![ls:只有一個符合模式時顯示目錄名稱](https://rvso.com/image/168781/ls%EF%BC%9A%E5%8F%AA%E6%9C%89%E4%B8%80%E5%80%8B%E7%AC%A6%E5%90%88%E6%A8%A1%E5%BC%8F%E6%99%82%E9%A1%AF%E7%A4%BA%E7%9B%AE%E9%8C%84%E5%90%8D%E7%A8%B1.png)
當用於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 -- "$@"
}
- 上面的函數不接受任何選項作為參數傳遞
- 它只是檢查是否:
- 只有一個參數
- 參數是一個目錄
如果這兩個條件成立,則在列出目錄內容之前列印目錄名稱。
% 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
您可以在以後使用該命令。