Liệt kê các tệp và thư mục bằng lệnh 'ls'


11

Chạy lệnh lstrên thư mục hiện tại và nhận đầu ra:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Tôi muốn liệt kê chúng như:

1. Applications
2. Desktop
3. Documents
4. Downloads
5. Library
6. Movies
7. Music
8. Pictures
9. Public

Điều này có thể đạt được bằng cách sử dụng lessmột cách trung gian

ls | less -N

Làm thế nào để liệt kê chúng một cách đơn giản?


Bạn có muốn điều này luôn xảy ra, hoặc chỉ đôi khi? Trong trường hợp đầu tiên, bạn có thể tạo bí danh ls cho một trong các lệnh trong câu trả lời; trong lần thứ hai, tạo một bí danh mới - nói "lsn" với lệnh.
jamesqf

Câu trả lời:


16

Hoặc đơn giản là làm:

ls -b |nl -s '. ' -w 1
1. a\ file\ with\ nonewline
2. a\ file\ with\nnewline
3. a\ file\ with\ space
4. afile

từ man nl:

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers

13

Bạn nên chuyển đầu ra của lslệnh khác. Đề nghị của tôi là sử dụng awktrong cách này :

$ ls -b --group-directories-first | awk '{print NR ". " $0}'
1. dir1
2. dir2
3. dir3
4. z-dir1
5. z-dir2
6. z-dir3
7. file1
8. file2
9. file3
10. file4
11. file5
12. file6
13. file7
14. file\nnewline
  • Xin lưu ý rằng tệp file\nnewlinechứa ký tự dòng mới \ntrong tên của nó được thoát bởi tùy chọn -b.

  • tùy chọn --group-directories-firstsẽ xuất các thư mục trước các tập tin.

Một cách khác có thể là sử dụng cho vòng lặp (nhưng trong trường hợp này để đặt các thư mục vào danh sách cầu xin sẽ trở nên khó khăn hơn):

n=1; for i in *; do echo $((n++)). $i; done

11

Nếu chỉ hiển thị một số là trường hợp, thì bạn có một số tùy chọn như sau cũng như less -Ncách của bạn :

$ ls |cat -n
$ ls |nl

Nếu bạn muốn đánh số đầu ra tùy chỉnh, thì tôi khuyên bạn nên sử dụng findvà làm bất cứ điều gì bạn muốn in:

find . -exec bash -c 'for fnd; do printf "%d. %s\n" "$((++i))" "$fnd"; done ' _ {} +

POSIXly, bạn sẽ làm:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +

Trong trường hợp này, iphải được khởi tạo trước:i=0; find ...
rexkogitans 26/03/18

điều đó không nhất thiết ở đây, vì -exec sh -c '....' nó đang chạy dưới lớp vỏ sh riêng biệt.
αғsнιη

3

Bạn cũng có thể làm điều này hoàn toàn với một đoạn script Bash ngắn:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
i=0
for f in *; do
    printf '%d. %s\n' "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

Bạn thậm chí có thể ưa thích và điền số dòng cho hơn 9 kết quả:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
ls=(*)
pad=${#ls[@]}
pad=${#pad}
i=0
for f in *; do
    printf '%*d. %s\n' "$pad" "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

Sử dụng

Giả sử rằng bạn đã lưu tập lệnh dưới dạng tệp thực thi numbered-ls.shtrong thư mục làm việc hiện tại:

./numbered-ls.sh [DIRECTORY]

Đối số DIRECTORYlà tùy chọn và mặc định cho thư mục làm việc hiện tại.

Giải trình

  1. Nếu tập lệnh được gọi với một đối số, hãy thay đổi thư mục làm việc thành đường dẫn trong đối số đầu tiên.

  2. Khớp tất cả các mục của thư mục làm việc hiện tại và xem qua chúng. Đối với mỗi mục tăng một bộ đếm và in giá trị của nó cùng với tên của mục nhập. Các ký tự ngắt dòng trong tên của mục được thay thế bằng ^N.

  3. Đưa đầu ra qua cat -vtđể xử lý một cách duyên dáng với các tên tệp có chứa các ký tự không in được mà thiết bị đầu cuối có thể hiểu là các ký tự điều khiển.

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.