'Ls' komutu ile dosya ve dizinleri numaralandırma


11

lsGeçerli Dizin üzerinde Komutu çalıştırın ve çıktıyı alın:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Onları şöyle numaralandırmak istiyorum:

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

Bu, lessara bir yolla elde edilebilir

ls | less -N

Onları basit bir şekilde nasıl numaralandırırım?


Bunun her zaman ya da sadece bazen olmasını ister misiniz? İlk durumda, cevaplardaki komutlardan birine ls takma adı oluşturabilirsiniz; ikincisinde, yeni bir takma ad oluşturun - komuta "lsn" deyin.
jamesqf

Yanıtlar:


16

Veya basitçe yapın:

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

from man nl:

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

13

Çıkışını lsbaşka bir komuta yönlendirmelisiniz. Benim önerim kullanmaktır awkiçinde bu şekilde :

$ 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
  • Lütfen dosya adında seçenekten kaçan file\nnewlineyeni satır karakteri içerdiğini unutmayın .\n-b

  • seçenek --group-directories-first, dosyalardan önce dizinleri çıktılar.

Başka bir olası yol döngü için kullanmaktır (ancak bu durumda dizinleri listenin yalvarmasına yerleştirmek zorlaşacaktır):

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

11

sadece bir sayı gösteriliyorsa, aşağıdaki gibi birkaç seçeneğiniz vardır less -N:

$ ls |cat -n
$ ls |nl

Özelleştirilmiş çıktı numaralandırma findistiyorsanız, yazdırmak istediğiniz her şeyi kullanmanızı ve yapmayı öneririm :

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

POSIXly, şunları yapardınız:

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

Bu durumda, iönceden başlatılmalıdır:i=0; find ...
rexkogitans

-exec sh -c '....' ayrı sh kabuğu altında çalıştığı için burada olması gerekmez .
αғsнιη

3

Bunu tamamen kısa bir Bash betiğiyle de yapabilirsiniz:

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

Hatta 9'dan fazla sonuç için süslü olabilir ve satır numarasını doldurabilirsiniz:

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

kullanım

Komut dosyasını numbered-ls.shgeçerli çalışma dizinine yürütülebilir bir dosya olarak kaydettiğinizi varsayarsak :

./numbered-ls.sh [DIRECTORY]

Bağımsız değişken DIRECTORYisteğe bağlıdır ve varsayılan olarak geçerli çalışma dizinini kullanır.

açıklama

  1. Komut dosyası bir bağımsız değişkenle çağrıldıysa, çalışma dizinini ilk bağımsız değişkendeki yol olarak değiştirin.

  2. Geçerli çalışma dizininin tüm girdilerini eşleştirin ve onlara bakın. Her girdi için bir sayaç artar ve değerini girdinin adıyla birlikte yazdırır. Giriş adındaki satır sonu karakterleri ile değiştirilir ^N.

  3. cat -vtTerminalin kontrol karakterleri olarak yorumlayabileceği yazdırılamayan karakterler içeren dosya adlarıyla zarif bir şekilde ilgilenmek için çıktıyı birbirine bağlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.