Wie liste ich * .tar.gz auf, einen Dateinamen pro Zeile?

8

Ich versuche, jede .tar.gzDatei mit dem folgenden Befehl aufzulisten:

ls *.tar.gz -l

... Es zeigt mir folgende Liste:

-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file1.tar.gz
-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file2.tar.gz

Ich muss es jedoch nur so auflisten:

file1.tar.gz 
file2.tar.gz

und auch nicht:

file1.tar.gz file2.tar.gz

Wie wird das "richtig" gemacht?

McLan
quelle
6
Es ist eine gute Angewohnheit, Optionen vor Dateinamen zu verwenden. und Sie müssen -1 anstelle von -l verwenden
AnonymousLurker
17
ls -1 *.tar.gz, Aber was wollen Sie die Liste verwenden , für ? Wenn Sie diesen Dateinamen etwas lsantun , ist dies nicht der richtige Weg. Siehe Warum * nicht * `ls` analysieren (und was stattdessen tun)?
Kusalananda
3
Das Handbuch, das Sie benötigen, ist man ls. Stellen Sie sicher, dass Ihre Anzeigeschrift einen guten Kontrast zwischen 1 (eins) und l (Kleinbuchstabe ell) aufweist.
Strg-Alt-Delor

Antworten:

39

Die -1Option (die Ziffer "Eins", nicht Kleinbuchstaben "L") listet eine Datei pro Zeile ohne weitere Informationen auf:

ls -1 -- *.tar.gz
Stephen Kitt
quelle
1
Warum die doppelten Striche? ls -1 *.tar.gzfunktioniert genauso gut.
RonJohn
8
@ RonJohn vermeidet Überraschungen mit Dateinamen, die mit beginnen -.
Stephen Kitt
5
Insbesondere ... war Say ich ein Angreifer, und hatte die folgenden Dateien: .hiddenfile, benign.php, evil.bin, --hide=*evil*; ohne das --wirst du nicht sehen evil.bin oder --hide=*evil* .
wizzwizz4
Ich bin völlig enttäuscht, dass es keine gibt -2(oder -3 usw.)! ;-)
Peter - Reinstate Monica
1
(... was mich aufblicken ließ columns!)
Peter - Monica
19

Wenn Sie nur die Dateinamen benötigen, können Sie Folgendes verwenden printf:

printf '%s\n' *.tar.gz

... erweitert die Shell den *.tar.gzPlatzhalter auf die Dateinamen und printfdruckt sie dann aus, gefolgt von einer neuen Zeile. Diese Ausgabe würde sich geringfügig vonls der bei Dateinamen mit eingebetteten Zeilenumbrüchen unterscheiden:

installieren

$ touch file{1,2}.tar.gz
$ touch file$'\n'3.tar.gz

ls

$ ls -1 -- *.tar.gz
file1.tar.gz
file2.tar.gz
file?3.tar.gz

printf

$ printf '%s\n' *.tar.gz
file1.tar.gz
file2.tar.gz
file
3.tar.gz
Jeff Schaller
quelle
6
Siehe auch ls -b, ls -Q, ls --quoting-style=....
Stephen Kitt
Und printf '%q\n'. (Beide GNU.)
dave_thompson_085
9

lsverhält sich anders, wenn sein Ausgang geleitet wird. Zum Beispiel:

ls          # outputs filenames in columns
ls | cat    # passes one filename per line to the cat command

Wenn Sie also alle Ihre *.tar.gzDateien sehen möchten , eine pro Zeile, können Sie dies tun:

ls *.tar.gz | cat

Aber was ist, wenn Sie Ihre Ausgabe nicht weiterleiten möchten? Gibt es eine Möglichkeit, lsdie Ausgabe der Dateinamen in eine Zeile zu erzwingen , ohne die Ausgabe weiterzuleiten?

Ja, mit dem -1Schalter. (Das ist ein Bindestrich mit der Nummer 1.) Sie können also folgende Befehle verwenden:

ls -1             # shows all (non-hidden) files, one per line
ls -1 *.tar.gz    # shows only *.tar.gz files, one per line
J L
quelle
7

Oder mit GNU find:

find  -name "*.tar.gz"  -printf '%P\n'

Im Gegensatz zu dem lsmit *ihm wird für die Suche .tar.gzDateien rekursiv:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
Arkadiusz Drabczyk
quelle
Warum -printf '%P\n'und nicht nur -print- ab diesem Zeitpunkt findfunktioniert jeder Posix-kompatible Computer .
Martin Bonner unterstützt Monica
@MartinBonner da -printwird ./vor dem Dateinamen hinzugefügt .
Arkadiusz Drabczyk
4

Ein etwas runder und kurvenreicher Weg:

for i in *.tar.gz; do
    echo "$i"
done

BEARBEITEN: Anführungszeichen hinzugefügt, um seltsame Dateinamen zu verarbeiten

snetch
quelle
5
touch -- '-e \a.tar.gz'aus einem Grund, Ihre Variablen und unix.stackexchange.com/q/65803/117549 zu zitieren, aus Gründen, printf anstelle von echo zu verwenden
Jeff Schaller
oof, ich habe gerade 5 Minuten damit verbracht herauszufinden, wie man die resultierende -e \a.tar.gzDatei entfernt
snetch
3
Es tut uns leid! rm -- '-e \a.tar.gz'sollte den Trick machen
Jeff Schaller
Du bist gut, es war eine Lektion, und ich habe gelernt, dass --das für rmund viele andere funktioniert .
Snetch
@ JeffSchaller: Die andere Lösung für lokale Namen istrm_etc './-x blah'
dave_thompson_085