Enumerar archivos y directorios con el comando 'ls'

11

Ejecute Command lsen el directorio actual y obtenga el resultado:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Me gustaría enumerarlos como:

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

Esto podría lograrse utilizando lessde manera intermedia

ls | less -N

¿Cómo enumerarlos de una manera directa?

Cálculo
fuente
¿Quieres que esto suceda siempre, o solo a veces? En el primer caso, puede crear un alias de ls para uno de los comandos en las respuestas; en el segundo, cree un nuevo alias: diga "lsn" al comando.
jamesqf

Respuestas:

16

O simplemente hazlo:

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

de man nl:

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

Debe canalizar la salida de lsa otro comando. Mi sugerencia es usar awkde esta manera :

$ 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
  • Tenga en cuenta que el archivo file\nnewlinecontiene caracteres de nueva línea \nen su nombre que la opción escapa -b.

  • la opción --group-directories-firstmostrará los directorios antes que los archivos.

Otra forma posible es usar for loop (pero en este caso colocar los directorios en el inicio de la lista será más difícil):

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

si solo se muestra un número, entonces tiene varias opciones como las siguientes, así como a su less -Nmanera:

$ ls |cat -n
$ ls |nl

Si desea una numeración de salida personalizada, le sugiero que use findy haga lo que quiera imprimir:

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

POSIXY, harías:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +
αғsнιη
fuente
En este caso, idebe inicializarse de antemano:i=0; find ...
rexkogitans
eso no es necesariamente aquí, ya que -exec sh -c '....' se ejecuta bajo un shell sh separado.
αғsнιη
3

También puede hacer esto completamente con un breve script de 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

Incluso puede ser elegante y rellenar el número de línea para obtener más de 9 resultados:

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

Suponiendo que guardó el script como un archivo ejecutable numbered-ls.shen el directorio de trabajo actual:

./numbered-ls.sh [DIRECTORY]

El argumento DIRECTORYes opcional y por defecto es el directorio de trabajo actual.

Explicación

  1. Si se invocó el script con un argumento, cambie el directorio de trabajo a la ruta en el primer argumento.

  2. Haga coincidir todas las entradas del directorio de trabajo actual y mírelas. Para cada entrada, incremente un contador e imprima su valor junto con el nombre de la entrada. Los caracteres de salto de línea en el nombre de la entrada se reemplazan con ^N.

  3. Canalice la salida cat -vtpara tratar con gracia los nombres de archivo que contienen caracteres no imprimibles que el terminal puede interpretar como caracteres de control.

David Foerster
fuente