Mar*_*ter 10 ls bash zsh directory symlink
ls选项--group-directories-first导致目录列在顶部,这使得输出ls漂亮和干净:
ls -l --group-directories-first
Run Code Online (Sandbox Code Playgroud)
但是,它不会作用于symlinks实际上symlinks是目录的 。有可能使用
ls -l -L --group-directories-first
Run Code Online (Sandbox Code Playgroud)
它将在顶部列出这两种目录,但不会区分正确的目录和符号链接的目录,这再次令人困惑。
可以ls在顶部显示符号链接目录,同时仍然使它们与常规目录不同吗?
编辑:
我正在使用bash.
不,但如果使用zsh,你可以这样做:
mll() {
(($#)) || set -- *(N-/) *(N^-/)
(($#)) && ls -ldU -- $@
}
Run Code Online (Sandbox Code Playgroud)
您还可以定义一个 globbing 排序顺序,如:
dir1st() { [[ -d $REPLY ]] && REPLY=1-$REPLY || REPLY=2-$REPLY;}
Run Code Online (Sandbox Code Playgroud)
并使用它:
ls -ldU -- *(o+dir1st)
Run Code Online (Sandbox Code Playgroud)
这样的话,你可以用它比其他命令ls或ls使用不同的选项,或针对不同的模式,如:
ls -ldU -- .*(o+dir1st) # to list the hidden files and dirs
Run Code Online (Sandbox Code Playgroud)
或者:
ls -ldU -- ^*[[:lower:]]*(o+dir1st) # to list the all-uppercase files and dirs
Run Code Online (Sandbox Code Playgroud)
如果必须使用bash,则等效于:
mll() (
if (($# == 0)); then
dirs=() others=()
shopt -s nullglob
for f in *; do
if [[ -d $f ]]; then
dirs+=("$f")
else
others+=("$f")
fi
done
set -- "${dirs[@]}" "${others[@]}"
fi
(($#)) && exec ls -ldU -- "$@"
)
Run Code Online (Sandbox Code Playgroud)
bash没有 globbing 限定符或任何影响 glob 排序顺序的方法,或任何基于每个 glob 转换 nullglob 的方法,或具有选项的本地上下文(除了启动子外壳,因此()而不是{}上面的)AFAIK .