Auflisten von Dateien und Verzeichnissen mit dem Befehl 'ls'

11

Führen Sie den Befehl lsfür das aktuelle Verzeichnis aus und erhalten Sie die Ausgabe:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Ich möchte sie wie folgt aufzählen:

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

Dies könnte auf lessmittlere Weise erreicht werden

ls | less -N

Wie kann man sie auf einfache Weise aufzählen?

Infinitesimalrechnung
quelle
Möchten Sie, dass dies immer oder nur manchmal passiert? Im ersten Fall können Sie einen Alias ​​von ls für einen der Befehle in den Antworten erstellen. Erstellen Sie im zweiten Schritt einen neuen Alias ​​- sagen Sie "lsn" zum Befehl.
Jamesqf

Antworten:

16

Oder einfach:

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

von man nl:

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

Sie sollten die Ausgabe von lsan einen anderen Befehl weiterleiten. Mein Vorschlag ist , zu verwenden , awkin dieser Art und Weise :

$ 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
  • Bitte beachten Sie, dass die Datei in ihrem Namen ein file\nnewlineZeilenumbruchzeichen enthält , das \nvon der Option maskiert wird -b.

  • Die Option --group-directories-firstgibt die Verzeichnisse vor den Dateien aus.

Eine andere Möglichkeit ist die Verwendung der for-Schleife (in diesem Fall wird es jedoch schwieriger, die Verzeichnisse am Anfang der Liste zu platzieren):

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

Wenn nur eine Nummer angezeigt wird, haben Sie verschiedene Möglichkeiten less -N:

$ ls |cat -n
$ ls |nl

Wenn Sie eine benutzerdefinierte Ausgabenummerierung wünschen, würde ich vorschlagen, findalles zu verwenden und zu tun, was Sie drucken möchten:

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

POSIXly würden Sie tun:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +
αғsнιη
quelle
In diesem Fall imuss im Voraus initialisiert werden:i=0; find ...
Rexkogitans
Das ist hier nicht unbedingt der Fall, da das -exec sh -c '....' unter einer separaten Sh-Shell läuft.
αғsнιη
3

Sie können dies auch vollständig mit einem kurzen Bash-Skript tun:

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

Sie können sogar ausgefallen sein und die Zeilennummer für mehr als 9 Ergebnisse auffüllen:

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

Verwendung

Angenommen, Sie haben das Skript als ausführbare Datei numbered-ls.shim aktuellen Arbeitsverzeichnis gespeichert :

./numbered-ls.sh [DIRECTORY]

Das Argument DIRECTORYist optional und verwendet standardmäßig das aktuelle Arbeitsverzeichnis.

Erläuterung

  1. Wenn das Skript mit einem Argument aufgerufen wurde, ändern Sie das Arbeitsverzeichnis in den Pfad im ersten Argument.

  2. Ordnen Sie alle Einträge des aktuellen Arbeitsverzeichnisses zu und überprüfen Sie sie. Inkrementieren Sie für jeden Eintrag einen Zähler und drucken Sie seinen Wert zusammen mit dem Namen des Eintrags aus. Zeilenumbruchzeichen im Namen des Eintrags werden durch ersetzt ^N.

  3. Leiten Sie die Ausgabe durch cat -vt, um ordnungsgemäß mit Dateinamen umzugehen, die nicht druckbare Zeichen enthalten, die das Terminal möglicherweise als Steuerzeichen interpretiert.

David Foerster
quelle