Énumérer les fichiers et répertoires avec la commande 'ls'

11

Exécutez la commande lssur le répertoire actuel et obtenez la sortie:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Je voudrais les énumérer comme:

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

Cela pourrait être réalisé en utilisant lessde manière intermédiaire

ls | less -N

Comment les énumérer de manière simple?

Calcul
la source
Voulez-vous que cela se produise toujours, ou juste parfois? Dans le premier cas, vous pouvez créer un alias de ls vers l'une des commandes des réponses; dans le second, créez un nouvel alias - dites "lsn" à la commande.
jamesqf

Réponses:

16

Ou faites simplement:

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нιη
la source
13

Vous devez diriger la sortie de lsvers une autre commande. Ma suggestion est d'utiliser awkde cette façon :

$ 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
  • Veuillez noter que le fichier file\nnewlinecontient un caractère de nouvelle ligne \ndans son nom qui est échappé par l'option -b.

  • l'option --group-directories-firstaffichera les répertoires avant les fichiers.

Une autre façon possible est d'utiliser for loop (mais dans ce cas, placer les répertoires au début de la liste deviendra plus difficile):

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

si simplement afficher un numéro est le cas, alors vous avez plusieurs options comme suit ainsi que votre less -Nchemin:

$ ls |cat -n
$ ls |nl

Si vous souhaitez une numérotation de sortie personnalisée, je vous suggère d'utiliser findet de faire tout ce que vous souhaitez imprimer:

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

POSIX, vous feriez:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +
αғsнιη
la source
Dans ce cas, idoit être initialisé au préalable:i=0; find ...
rexkogitans
ce n'est pas nécessairement ici, car le -exec sh -c '....' s'exécute sous un shell sh séparé.
αғsнιη
3

Vous pouvez également le faire entièrement avec un court 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

Vous pouvez même être fantaisie et saisir le numéro de ligne pour plus de 9 résultats:

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

Usage

En supposant que vous avez enregistré le script en tant que fichier exécutable numbered-ls.shdans le répertoire de travail actuel:

./numbered-ls.sh [DIRECTORY]

L'argument DIRECTORYest facultatif et correspond par défaut au répertoire de travail actuel.

Explication

  1. Si le script a été invoqué avec un argument, remplacez le répertoire de travail par le chemin du premier argument.

  2. Faites correspondre toutes les entrées du répertoire de travail actuel et regardez-les. Pour chaque entrée, incrémentez un compteur et imprimez sa valeur avec le nom de l'entrée. Les caractères de saut de ligne dans le nom de l'entrée sont remplacés par ^N.

  3. Dirigez la sortie cat -vtpour gérer avec élégance les noms de fichiers qui contiennent des caractères non imprimables que le terminal peut interpréter comme des caractères de contrôle.

David Foerster
la source