ls -l --group-directories-first (aktifkan symlink juga)

9

lsopsi --group-directories-firstmenyebabkan direktori terdaftar di atas, yang membuat output menjadi lsbagus dan bersih:

ls -l --group-directories-first

Namun, itu tidak bertindak symlinks, yang sebenarnya symlinkske direktori. Ada kemungkinan untuk digunakan

ls -l -L --group-directories-first

yang akan mencantumkan kedua jenis direktori di atas, tetapi tidak akan membedakan antara direktori yang tepat dan direktori yang dikaitkan, yang lagi-lagi membingungkan.

Dapatkah lsmenampilkan direktori yang disinkronkan di atas, sambil tetap membedakannya dari direktori biasa?

EDIT: Saya menggunakan bash.

Martin Vegter
sumber
Ini adalah perilaku istimewa di pihak ls. Menurut stat()panggilan sistem, tautan simbolik ke direktori masih berupa direktori ( S_ISDIR(st_mode)akan mengembalikan true). Bukti lsdiskon symlinks sebelum memeriksa ini.
goldilocks
2
@goldilocks, tidak, lstidak lstat()(dan readlinkuntuk symlink) kecuali jika Anda menggunakan -Lopsi (dalam hal ini yang digunakan stat())
Stéphane Chazelas
@StephaneChazelas: Hmm, hidup dan belajar. Saya pikir itu S_ISLNK(st_mode)juga mengembalikan true via stat(), tetapi tidak - hanya melakukannya melalui lstat(). Juga bahwa ISLNK tidak mengembalikan true melalui stat bahkan jika tautannya adalah tautan ke tautan. Berarti itu ISLNKmungkin tidak pernah kembali benar melalui stat, meskipun itu semacam tidak ditentukan ...
goldilocks
@goldilocks, statmemberi Anda properti file di akhir symlink. Jika itu tidak ada atau tidak dapat diakses, statmengembalikan ENOENT, sehingga apa yang dikembalikan oleh stattidak akan pernah menjadi symlink. stat()tidak akan pernah memberi tahu Anda apa pun tentang symlink, sama seperti opentidak akan pernah membuka symlink, atau chmod()tidak akan mengubah izin symlink ... dll.
Stéphane Chazelas

Jawaban:

5

Tidak, tetapi jika menggunakan zsh, Anda bisa melakukan:

mll() {
  (($#)) || set -- *(N-/) *(N^-/)
  (($#)) && ls -ldU -- $@
}

Anda juga dapat menentukan urutan pengurutan globbing seperti:

dir1st() { [[ -d $REPLY ]] && REPLY=1-$REPLY || REPLY=2-$REPLY;}

dan gunakan seperti:

ls -ldU -- *(o+dir1st)

Dengan begitu, Anda dapat menggunakannya untuk perintah selain lsatau dengan lsopsi yang berbeda, atau untuk pola yang berbeda seperti:

ls -ldU -- .*(o+dir1st) # to list the hidden files and dirs

atau:

ls -ldU -- ^*[[:lower:]]*(o+dir1st) # to list the all-uppercase files and dirs

Jika Anda harus menggunakan bash, yang setara akan seperti:

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 -- "$@"
)

bashtidak memiliki kualifikasi globbing atau cara apa pun untuk memengaruhi urutan pengurutan, atau cara apa pun untuk mengubah nullglob berdasarkan per-glob, atau memiliki konteks lokal untuk opsi (selain memulai subkulit, karenanya ()bukan di {}atas) AFAIK .

Stéphane Chazelas
sumber
1
Apakah ada trik serupa untuk bash?
Martin Vegter