Menghitung file dan direktori dengan perintah 'ls'

11

Jalankan Perintah lspada Direktori Saat Ini dan dapatkan output:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Saya ingin menghitungnya seperti:

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

Ini bisa dicapai dengan menggunakan lesscara perantara

ls | less -N

Bagaimana cara menghitungnya secara langsung?

Kalkulus
sumber
Apakah Anda ingin ini selalu terjadi, atau kadang-kadang saja? Dalam kasus pertama, Anda dapat membuat alias ls ke salah satu perintah dalam jawaban; di yang kedua, buat alias baru - katakan "lsn" ke perintah.
jamesqf

Jawaban:

16

Atau cukup lakukan:

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

dari man nl:

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers
αғsнιη
sumber
13

Anda harus menyalurkan output lske perintah lain. Saran saya adalah dengan menggunakan awkdi cara ini :

$ 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
  • Harap perhatikan bahwa file tersebut file\nnewlineberisi karakter baris baru \ndalam namanya yang diloloskan oleh opsi -b.

  • opsi --group-directories-firstakan menampilkan direktori sebelum file.

Cara lain yang mungkin adalah dengan menggunakan untuk loop (tetapi dalam kasus ini untuk menempatkan direktori di pengemis daftar akan menjadi lebih sulit):

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

jika hanya menunjukkan angka, maka Anda memiliki beberapa opsi sebagai berikut dan juga less -Ncara Anda :

$ ls |cat -n
$ ls |nl

Jika Anda ingin penomoran hasil kustomisasi, maka saya akan menyarankan untuk menggunakan finddan melakukan apa pun yang ingin Anda cetak:

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

POSIXly, Anda akan melakukan:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +
αғsнιη
sumber
Dalam hal ini, iharus diinisialisasi sebelumnya:i=0; find ...
rexkogitans
itu belum tentu di sini, karena -exec sh -c '....' berjalan di bawah shell sh terpisah.
αғsнιη
3

Anda juga dapat melakukan ini sepenuhnya dengan skrip Bash pendek:

#!/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

Anda bahkan dapat menjadi mewah dan menambahkan nomor baris untuk lebih dari 9 hasil:

#!/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

Pemakaian

Dengan asumsi bahwa Anda menyimpan skrip sebagai file yang dapat dieksekusi numbered-ls.shdi direktori kerja saat ini:

./numbered-ls.sh [DIRECTORY]

Argumennya DIRECTORYopsional dan default ke direktori kerja saat ini.

Penjelasan

  1. Jika skrip dipanggil dengan argumen, ubah direktori kerja ke jalur di argumen pertama.

  2. Cocokkan semua entri dari direktori kerja saat ini dan lihatlah. Untuk setiap entri menambah penghitung dan mencetak nilainya bersama dengan nama entri. Karakter baris istirahat atas nama entri diganti dengan ^N.

  3. Pipa output melalui cat -vtuntuk berurusan dengan anggun dengan nama file yang mengandung karakter yang tidak dapat dicetak yang terminal dapat menafsirkan sebagai karakter kontrol.

David Foerster
sumber