ls -l - กลุ่มไดเรกทอรีแรก (ดำเนินการกับ symlink ด้วย)


9

lsตัวเลือก--group-directories-firstทำให้ไดเรกทอรีที่จะแสดงรายการอยู่ด้านบนซึ่งทำให้การส่งออกของlsดีและสะอาด:

ls -l --group-directories-first

อย่างไรก็ตามมันไม่ได้ดำเนินการกับsymlinksซึ่งเป็นsymlinksไดเรกทอรีจริงๆ มีความเป็นไปได้ที่จะใช้เป็น

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

ซึ่งจะแสดงรายการทั้งสองประเภทของไดเรกทอรีที่ด้านบน แต่จะไม่แยกความแตกต่างระหว่างไดเรกทอรีที่เหมาะสมและไดเรกทอรี symlinked ซึ่งทำให้เกิดความสับสนอีกครั้ง

สามารถlsแสดงไดเรกทอรี symlinked ด้านบนในขณะที่ยังคงแตกต่างจากไดเรกทอรีปกติได้หรือไม่

แก้ไข:bashฉันใช้


lsนี่คือการทำงานที่มีนิสัยแปลกในส่วนของ ตามการstat()เรียกของระบบลิงก์สัญลักษณ์ไปยังไดเร็กทอรียังคงเป็นไดเร็กทอรี ( S_ISDIR(st_mode)จะคืนค่าจริง) evidentially lsส่วนลด symlinks ก่อนที่มันจะตรวจสอบนี้
goldilocks

2
@ goldilocks, no, lsทำlstat()(และreadlinkสำหรับ symlink) ยกเว้นว่าคุณใช้-Lตัวเลือก (ซึ่งในกรณีนี้ใช้stat())
Stéphane Chazelas

@StephaneChazelas: อืมใช้ชีวิตและเรียนรู้ ฉันคิดว่ามันS_ISLNK(st_mode)ส่งคืนจริงด้วยstat()เช่นกัน แต่ไม่ได้ทำเช่นนั้นผ่านlstat()เท่านั้น นอกจากนี้ ISLNK จะไม่ส่งคืนค่าจริงผ่านทางสถิติแม้ว่าลิงก์จะเป็นลิงก์ไปยังลิงก์ก็ตาม หมายความว่าISLNKไม่อาจกลับจริงผ่านทางสถิติ แต่ที่ไม่ได้ระบุชนิดของ ...
Goldilocks

@goldilocks statให้คุณสมบัติของไฟล์ในตอนท้ายของ symlink หากไม่มีอยู่หรือไม่สามารถเข้าถึงได้การstatส่งคืน ENOENT ดังนั้นสิ่งที่ส่งคืนโดยstatจะไม่เป็น symlink stat()จะไม่บอกอะไรเกี่ยวกับ symlinks เช่นเดียวกับที่openจะไม่เปิด symlink หรือchmod()จะไม่เปลี่ยนสิทธิ์ของ symlink ... ฯลฯ
Stéphane Chazelas

คำตอบ:


5

ไม่ แต่ถ้าใช้zshคุณสามารถทำได้:

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

คุณสามารถกำหนดลำดับการจัดเรียงแบบต่อไปนี้เช่น:

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

และใช้มันเช่น:

ls -ldU -- *(o+dir1st)

ด้วยวิธีนี้คุณสามารถใช้มันสำหรับคำสั่งอื่นนอกเหนือจากlsหรือด้วยlsตัวเลือกที่แตกต่างกันหรือสำหรับรูปแบบที่แตกต่างกันเช่น:

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

หรือ:

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

หากคุณต้องใช้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 -- "$@"
)

bashไม่มีตัวบ่งชี้แบบกลม ๆ หรือวิธีใด ๆ ที่จะส่งผลต่อลำดับการเรียงของ globs หรือวิธีใดก็ตามที่จะเปลี่ยนค่า nullglob เป็นพื้นฐานต่อแต่ละกลุ่มหรือมีบริบทท้องถิ่นสำหรับตัวเลือก (นอกเหนือจากการเริ่ม subshell ดังนั้น()แทนที่จะเป็น{}ด้านบน) AFAIK .


1
มีเคล็ดลับที่คล้ายกันbashหรือไม่
Martin Vegter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.