這個類似的問題已經有很多答案了。但沒有一個能滿足我的要求。我想
不使用glob()語法列出一個目錄下的所有目錄
*,即我想直接使用lsdir somedir輸出應包含目錄的基本名稱,就像您剛剛使用時
ls一樣,例如:$ lsdir path/to/some/dir dir1 dir2 dir3 dir4但不是這個:
$ lsdir path/to/dir path/to/dir/dir1 path/to/dir/dir2 path/to/dir/dir3 path/to/dir/dir4為了滿足要求1,定義一個函式似乎是可行的,但無論如何我們將使用
-d選項,列出ls命令引數的目錄本身。并且在使用
-d選項時,ls列出目錄名稱,并在前面加上其父項,如上所示。ls應保留格式(顏色、對齊、排序)。為了滿足要求 2,我們可以使用
find,但是這樣我們就失去了所有的ls輸出格式,比如著色(基于自定義的 dircolors 主題)、對齊(在對齊的列中輸出)、排序(使用各種標志和列優先的自定義排序)方式),也許還有其他一些事情。
我知道同時想要這么多功能太貪心了,事實上我可以沒有它們。
可以手動模擬ls輸出格式,但這太不一致了。
我想知道是否有辦法實作這一點并且仍然使用ls,即如何使用ls.
uj5u.com熱心網友回復:
這可能是您正在尋找的:
cd path/to/dir && dirs=(*/) && ls -d "${dirs[@]%?}"
也許
(shopt -s nullglob; cd path/to/dir && dirs=(*/) && ((${#dirs[@]} > 0)) && ls -d "${dirs[@]%?}")
第二個版本在子 shell 中運行,如果里面沒有任何子目錄,則不列印任何內容path/to/dir。
uj5u.com熱心網友回復:
基于@M。Nejat Aydin 的出色回答,我將進一步改進以使其成為有用的命令,尤其是在處理選項和多個目錄方面。
list_directories() {
local opts=()
local args=()
for i in $(seq $#); do
if [[ "${!i}" == -* ]]; then
opts =("${!i}")
else
args =("${!i}")
fi
done
(( ${#args[@]} == 0 )) && args=('.')
local -i args_n_1=${#args[@]}-1
for i in $(seq 0 $args_n_1); do
if (( ${#args[@]} > 1 )); then
(( i > 0 )) && echo
echo "${args[i]}:"
fi
(
shopt -s nullglob
cd "${args[i]}" &&
dirs=(*/) &&
(( ${#dirs[@]} > 0 )) &&
ls -d "${opts[@]}" "${dirs[@]%?}"
)
done
}
alias lsd=list_directories
這lsd可以與任意數量的ls選項和自由混合的目錄一起使用。
$ lsd -h dir1 dir2 -rt ~
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422227.html
標籤:
