ls -l --group-thư mục-đầu tiên (cũng hoạt động trên các liên kết tượng trưng)


9

lstùy chọn --group-directories-firstlàm cho các thư mục được liệt kê ở trên cùng, điều này làm cho đầu ra của lsđẹp và sạch:

ls -l --group-directories-first

Tuy nhiên, nó không hoạt động symlinks, mà thực sự là các symlinksthư mục. Có khả năng sử dụng

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

trong đó sẽ liệt kê cả hai loại thư mục trên đầu, nhưng sẽ không phân biệt giữa thư mục phù hợp và thư mục symlinked, một lần nữa gây nhầm lẫn.

Có thể lshiển thị các thư mục symlinked trên đầu, trong khi vẫn giữ chúng khác biệt với các thư mục thông thường?

EDIT: Tôi đang sử dụng bash.


Đây là hành vi bình dị trên một phần của ls. Theo stat()cuộc gọi hệ thống, một liên kết tượng trưng đến một thư mục vẫn là một thư mục ( S_ISDIR(st_mode)sẽ trả về đúng). Rõ ràng lsgiảm giá các liên kết tượng trưng trước khi nó kiểm tra điều này.
goldilocks

2
@goldilocks, không, lskhông lstat()(và readlinkđối với các liên kết tượng trưng) trừ khi bạn sử dụng -Ltùy chọn (trong trường hợp đó là sử dụng stat())
Stéphane Chazelas

@StephaneChazelas: Hmm, sống và học hỏi. Tôi đã nghĩ rằng điều đó S_ISLNK(st_mode)cũng trở lại đúng thông qua stat(), nhưng nó không - nó chỉ làm như vậy thông qua lstat(). Ngoài ra, ISLNK không trả về true qua stat ngay cả khi liên kết là liên kết đến liên kết. Có nghĩa là điều đó ISLNKcó thể không bao giờ trả lại đúng thông qua stat, mặc dù đó là loại không xác định ...
goldilocks

@goldilocks, statcung cấp cho bạn các thuộc tính của tệp ở cuối (các) symlink. Nếu điều đó không tồn tại hoặc không thể truy cập được, thì stattrả về ENOENT, vì vậy những gì được trả về statsẽ không bao giờ là liên kết tượng trưng. stat()sẽ không bao giờ cho bạn biết bất cứ điều gì về liên kết tượng trưng, ​​giống như opensẽ không bao giờ mở liên kết tượng trưng hoặc chmod()sẽ không thay đổi quyền của liên kết tượng trưng ... vv
Stéphane Chazelas

Câu trả lời:


5

Không, nhưng nếu sử dụng zsh, bạn có thể làm:

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

Bạn cũng có thể định nghĩa một thứ tự sắp xếp toàn cầu như:

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

và sử dụng nó như:

ls -ldU -- *(o+dir1st)

Bằng cách đó, bạn có thể sử dụng nó cho các lệnh khác ngoài lshoặc lsvới các tùy chọn khác nhau hoặc cho các mẫu khác nhau như:

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

hoặc là:

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

Nếu bạn phải sử dụng bash, tương đương sẽ như sau:

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

bashkhông có vòng loại toàn cầu hoặc bất kỳ cách nào để ảnh hưởng đến thứ tự sắp xếp của các khối, hoặc bất kỳ cách nào để biến nullglob trên cơ sở toàn cầu hoặc có bối cảnh cục bộ cho các tùy chọn (ngoài việc bắt đầu một mạng con, do đó ()thay vì {}ở trên) AFAIK .


1
Có bất kỳ thủ thuật tương tự cho bash?
Martin Vegter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.