
Dies ist die Standardausgabe vonls -ln | nl
wolf@linux:~$ ls -lh | nl
1 total 24
2 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
3 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
4 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
total 24
Wäre es möglich, die Nummer statt mit mit bei den eigentlichen Dateien/Verzeichnissen zu beginnen, also bei der zweiten Zeile?
Gewünschte Ausgabe
wolf@linux:~$ ls -lh | nl
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
Antwort1
Verbrauchen Sie die erste Zeile mit etwas anderem und übergeben Sie den Rest annl
$ ls -lh | { sed -u q; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
sed
(mit -u
zum Deaktivieren der Pufferung), verbraucht eine Zeile und q
uit, wobei die Zeile vor der Beendigung implizit gedruckt wird. nl
verbraucht den Rest der Zeilen.
Wenn Sie die erste Zeile wirklich eingerückt haben möchten, können Sie dies folgendermaßen tun:
$ ls -lh | { sed -u 's/^/ /;q'; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
Wenn Sie die Zeilennummerierung weiter unten beginnen lassen möchten, geben Sie an, sed
wann q
ausgestiegen werden soll:
$ ls -alh | { sed -u 's/^/ /;3q'; nl; }
total 24
drwx------ 1 wolf wolf 186 Sep 24 22:18 .
drwx------ 1 wolf wolf 186 Sep 24 22:18 ..
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
/\.\.$/q
Sie können anstelle von auch etwas wie verwenden 3q
.
Antwort2
Dadurch wird nl
bei 0 begonnen:
$ ls -lh | nl -v 0
0 total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
Antwort3
Es ist irgendwie hässlich, aber zumindest mit der GNU Coreutils-Implementierung von nl
können Sie die zu nummerierenden Zeilen über einen regulären Ausdruck angeben - da t
ist nicht einer der möglichen Dateitypen in der ls
Longlist-Ausgabe1du könntest es tun
ls -lh | nl -bp'^[^t]'
Leider bleibt die Ausgabeausrichtung dadurch jedoch nicht erhalten.
Der formal korrekteste Ansatz besteht wahrscheinlich darin, die ls
Ausgabe in unterschiedliche Header- und Body-Abschnitte aufzuteilen:
$ ls -lh | sed -e '1s/.*/\\:\\:\\:\n&\n\\:\\:/' | nl
total 0
1 -rw-rw-rw- 1 steeldriver steeldriver 0 Sep 9 19:53 bar
2 -rw-r--r-- 1 steeldriver steeldriver 449 Sep 16 17:41 bash_envs
3 -rw-rw-rw- 1 steeldriver steeldriver 131 Sep 5 18:13 dirlist
4 -rw-r--r-- 1 steeldriver steeldriver 359 Sep 13 19:42 error_status
(standardmäßig ist der Kopfzeilen-Nummerierungsstilkeiner).
Antwort4
Sie können es stattdessen mit Folgendem versuchen awk
:
ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
Dadurch wird die Zeile „Summen“ ohne Nummerierung und alle übrigen Zeilen mit Zahlen rechtsbündig mit einer Feldbreite von 5 ausgedruckt. Der Abstand zwischen Zahl und Zeileninhalt beträgt zwei Leerzeichen (der Text nach dem 5s
in der printf()
Formatzeichenfolge); Sie können ihn durch etwas anderes ersetzen, beispielsweise \t
.
Wenn Sie die Zeile "Totals" nicht benötigen, können Sie
ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
oder
ls -lh | awk 'NR>1 {printf("%5s ",NR-1); print}'
stattdessen.