Làm thế nào để ls sử dụng định dạng dài (-l) trong khi vẫn theo các liên kết tượng trưng thư mục?


27

Tôi đã nhận thấy rằng ls -lkhông chỉ thay đổi định dạng của đầu ra, mà còn cả cách xử lý các liên kết tượng trưng thư mục:

> ls /rmn
biweekly.sh  daily.sh  logs ...

> ls -l /rmn
lrwxrwxrwx 1 root root 18 Feb 11  2011 /rmn -> /root/maintenance/

Tôi muốn có một danh sách chi tiết về những gì trong đó /rmn, không phải thông tin về /rmnsymlink.

Một cách giải quyết mà tôi có thể nghĩ đến là tạo ra một hàm shell hoạt động như thế này:

cd /rmn
ls -l
cd -

Nhưng điều đó có vẻ quá hack, đặc biệt là vì nó làm rối tung việc sử dụng tiếp theo cd -. Có cách nào tốt hơn?

(Tôi đang dùng CentOS 2.6.9)


Tôi cũng nhận thấy điều đó và đã đi tìm xem có ai để ý không. Đó là cách tôi đến đây. :)
Yevgeniy Afanasyev

Câu trả lời:


27

Xem nếu ls của bạn có các tùy chọn:

 -H, --dereference-command-line
     follow symbolic links listed on the command line 
 --dereference-command-line-symlink-to-dir
     follow each command line symbolic link that points to a directory

Nếu những điều đó không giúp ích, bạn có thể làm cho macro của bạn hoạt động mà không làm hỏng cd -bằng cách thực hiện:

(cd /rmn ; ls -l)

mà chạy trong một subshell.


Nó có -H, và đó đã là mẹo. Cảm ơn bạn!
RomanSt

4
Tôi thực sự muốn --dereference-command-line-symlink-to-dircó một hình thức ngắn.
wchargein

14

Tôi hoàn toàn không hiểu tại sao suy nghĩ về vấn đề đơn giản này lại quá phức tạp - nhưng có lẽ tôi đã hiểu sai câu hỏi. Dù sao: khi tôi cần một chức năng tương tự, tôi đã sử dụng:

ls -lL

Đó là mẹo trong trường hợp của tôi. Từ lstrang người đàn ông:

-L, --dereference
     when showing file information for a symbolic link, 
     show  information  for  the file the link references
     rather than for the link itself

Chẳng hạn, tôi đã tạo cho tôi một /media/sticklối tắt để truy cập dữ liệu trên thanh USB của mình. ls -l /media/sticksẽ hiển thị liên kết thực tế, trong khi ls -lL /media/sticksẽ hiển thị nội dung trên thanh USB.

Sau khi nghiên cứu sâu hơn về sự khác biệt giữa hoạt động bên trong -H-Lcuối cùng, tôi đã tìm thấy một bài viết tuyệt vời về vấn đề này trên blog Shallow Suy nghĩ (thậm chí có một số thủ thuật kịch bản shell gọn gàng cho niềm vui của bạn!)

Điều này chỉ ra sự khác biệt tinh tế giữa hai tùy chọn (cách tốt hơn so với hướng dẫn ban đầu!) Như sau:

  • -H - chỉ hủy bỏ các liên kết được đề cập rõ ràng trên dòng lệnh
  • -L- liên kết dereference ngay cả khi chúng không được đề cập trên dòng lệnh

(Khi hai cái này được sử dụng với các tác vụ đơn giản hàng ngày, nên không có sự khác biệt nào về đầu ra nói chung.)

Bên cạnh đó: Nếu bạn thích ghi nhớ dạng dài ( --option), có lẽ việc ghi nhớ sẽ ít phức tạp --dereferencehơn so với quái vật quá dài --dereference-command-line-symlink-to-dir.


5
ls -l /rmn/

sẽ làm điều đó hoặc

ls -l /rmn/.

Tuy nhiên, hành vi không nên khác nhau có và không có -l. Bạn đã có một bí danh cho ls?


3
lscờ là điên -llàm cho -Hmặc định tắt, như vậy -F. Xem coreutils - Những tập tin được liệt kê .
Mikel

@Mikel có vẻ như bạn hoàn toàn đúng về điều đó. Và vâng, đó là các loại hạt. (ngoài ra, tôi không có bí danh cho ls, đã cố thoát nó nhưng kết quả vẫn như vậy)
RomanSt

Thật vậy, nó thậm chí còn được chỉ định bởi POSIX. Tôi là người có ls='ls -F'bí danh thực sự.
Stéphane Chazelas
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.