我喜欢--group-directories-first
的旗帜ls
。我的 .zshrc 有这一行:
alias ls="ls -h --color='auto' --group-directories-first"
我唯一不喜欢的是目录的符号链接没有与目录分组。
我可以在命令中添加任何开关ls
来导致目录的符号链接与目录分组吗?我不愿意构建复合命令,因为我喜欢能够ls
动态添加额外的开关。
答案1
一种选择是使用该-L
标志:
-L, --取消引用
显示符号链接的文件信息时,显示链接引用的文件的信息,而不是链接本身的信息
例如,假设我有以下文件和目录:
$ ls -l --group-directories-first
total 0
drwxr-xr-x. 2 user group 6 Nov 30 08:19 zdir1
drwxr-xr-x. 2 user group 6 Nov 30 08:19 zdir2
-rw-r--r--. 1 user group 0 Nov 30 08:20 file1
-rw-r--r--. 1 user group 0 Nov 30 08:20 file2
lrwxrwxrwx. 1 user group 5 Nov 30 08:23 symlink -> zdir2
-L
使用时,符号链接会与目录一起排序:
$ ls -lL --group-directories-first
total 0
drwxr-xr-x. 2 user group 6 Nov 30 08:19 symlink
drwxr-xr-x. 2 user group 6 Nov 30 08:19 zdir1
drwxr-xr-x. 2 user group 6 Nov 30 08:19 zdir2
-rw-r--r--. 1 user group 0 Nov 30 08:20 file1
-rw-r--r--. 1 user group 0 Nov 30 08:20 file2
正如您所注意到的,ls
不再指示文件是否是符号链接。我不熟悉在ls
取消引用后显示符号链接的方法,但我编写了一个 hacky bash 函数来为您完成此操作:
lsd() {
ls -lL --group-directories-first | while read line; do
file=$(echo "$line" | awk '{print $NF}')
ls -ld "$file" 2>/dev/null | grep -q "^l"
if [ $? -eq 0 ]; then
symlink=$(ls -l $file | awk '{print $(NF-2),$(NF-1),$NF}')
echo "$line" | sed -e "s/^./l/" -e "s/$file/$symlink/"
else
echo "$line"
fi
done
}
本质上,脚本将确定文件输出是否ls -lL --group-directories-first
是符号链接。如果是,第一个字符将更改为l
,符号链接指向的内容将附加到行尾。
$ lsd
total 0
lrwxr-xr-x. 2 user group 6 Nov 30 13:49 symlink -> zdir2
drwxr-xr-x. 2 user group 6 Nov 30 13:49 zdir1
drwxr-xr-x. 2 user group 6 Nov 30 13:49 zdir2
-rw-r--r--. 1 user group 0 Nov 30 13:49 file1
-rw-r--r--. 1 user group 0 Nov 30 13:49 file2
答案2
最后,截至GNU coreutils v8.312019年,
ls --group-directories-first 还将符号链接分组到目录。