Enumera file e directory con il comando 'ls'


11

Esegui il comando lssulla directory corrente e ottieni l'output:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Vorrei elencarli come:

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

Ciò potrebbe essere ottenuto utilizzando lessin modo intermedio

ls | less -N

Come elencarli in modo semplice?


Vuoi che ciò accada sempre, o solo a volte? Nel primo caso, puoi creare un alias di ls per uno dei comandi nelle risposte; nel secondo, crea un nuovo alias - dì "lsn" al comando.
jamesqf,

Risposte:


16

O semplicemente:

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

da man nl:

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

13

È necessario reindirizzare l'output lsa un altro comando. Il mio consiglio è di usare awkin questo modo :

$ 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
  • Si noti che il file file\nnewlinecontiene un carattere di nuova riga \nnel suo nome che è evaso dall'opzione -b.

  • l'opzione --group-directories-firstgenererà le directory prima dei file.

Un altro modo possibile è usare per il ciclo (ma in questo caso posizionare le directory nell'accattonaggio dell'elenco diventerà più difficile):

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

11

se è solo mostrare un numero, allora hai diverse opzioni come segue e la tua less -Nstrada:

$ ls |cat -n
$ ls |nl

Se desideri una numerazione personalizzata dell'output, ti suggerisco di utilizzare finde fare qualunque cosa tu voglia stampare:

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

POSIX, faresti:

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

In questo caso, idevono essere inizializzati in anticipo:i=0; find ...
rexkogitans il

questo non è necessariamente qui, poiché -exec sh -c '....' è in esecuzione in sh shell separata.
αғsнιη,

3

Puoi anche farlo interamente con un breve script Bash:

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

Puoi anche essere fantasioso e riempire il numero di riga per più di 9 risultati:

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

uso

Supponendo di aver salvato lo script come file eseguibile numbered-ls.shnella directory di lavoro corrente:

./numbered-ls.sh [DIRECTORY]

L'argomento DIRECTORYè facoltativo e viene impostato automaticamente sulla directory di lavoro corrente.

Spiegazione

  1. Se lo script è stato invocato con un argomento, modificare la directory di lavoro nel percorso nel primo argomento.

  2. Abbina tutte le voci della directory di lavoro corrente e guardale. Per ogni voce incrementa un contatore e stampa il suo valore insieme al nome della voce. I caratteri di interruzione di riga nel nome della voce vengono sostituiti con ^N.

  3. Inoltra l'output cat -vtper gestire i nomi dei file che contengono caratteri non stampabili che il terminale può interpretare come caratteri di controllo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.