使用 --group-directories-first 时,是否有一种简单的方法可以将目录的软链接与目录分组?

使用 --group-directories-first 时,是否有一种简单的方法可以将目录的软链接与目录分组?

我喜欢--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 还将符号链接分组到目录。

相关内容