É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?


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

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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.