私は--group-directories-first
旗が好きですls
。私の.zshrcには次の行があります。
alias ls="ls -h --color='auto' --group-directories-first"
私が嫌いな唯一のことは、ディレクトリへのシンボリックリンクがディレクトリとグループ化されていないことです。
ls
ディレクトリへのシンボリックリンクをディレクトリとグループ化するためにコマンドに追加できるスイッチはありますか?私はls
追加のスイッチを動的に追加するのが好きなので、複合コマンドを書くのは嫌です。
答え1
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
シンボリックリンクを逆参照して表示する方法に慣れていませんが、これを行うためにハッキングされた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 はシンボリックリンクもディレクトリにグループ化します。