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?


¿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

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

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 ' _ {} +

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.