Come elencare * .tar.gz, un nome file per riga?


8

Sto cercando di elencare ogni .tar.gzfile, usando solo il seguente comando:

ls *.tar.gz -l

... Mi mostra il seguente elenco:

-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

Tuttavia, devo solo elencarlo in questo modo:

file1.tar.gz 
file2.tar.gz

e inoltre non:

file1.tar.gz file2.tar.gz

Come viene fatto "correttamente"?


6
è una buona abitudine utilizzare le opzioni prima dei nomi dei file. e devi usare -1 invece di -l
AnonymousLurker il

17
ls -1 *.tar.gz, Ma cosa si vuole utilizzare l'elenco per ? Se stai facendo qualcosa per quei nomi di file, allora lsnon è il modo giusto per farlo. Vedi Perché * non * analizzare `ls` (e cosa fare invece)?
Kusalananda

3
il manuale di cui hai bisogno è man ls. Assicurati che il carattere del tuo display abbia un buon contrasto tra 1 (uno) el (lettera minuscola ell).
ctrl-alt-delor,

Risposte:


39

L' -1opzione (la cifra "uno", non "L" minuscola) elencherà un file per riga senza altre informazioni:

ls -1 -- *.tar.gz

1
Perché i doppi trattini? ls -1 *.tar.gzfunziona altrettanto bene.
RonJohn,

8
@RonJohn evita sorprese con nomi di file che iniziano con -.
Stephen Kitt,

5
In particolare ... dire che sono stato un attaccante, e aveva i seguenti file: .hiddenfile, benign.php, evil.bin, --hide=*evil*, senza il --non vedrai evil.bin o --hide=*evil* .
wizzwizz4,

Sono completamente deluso che non ci sia -2(o -3 ecc.)! ;-)
Peter - Ripristina Monica il

1
(... che mi ha fatto alzare lo sguardo columns!)
Peter - Ripristina Monica il

19

Se hai bisogno solo dei nomi dei file, puoi usare printf:

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

... la shell espanderà il *.tar.gzcarattere jolly nei nomi dei file, quindi printfli stamperà, ciascuno seguito da una nuova riga. Questo output differirebbe un po 'da quello dils nel caso di nomi di file con newline incorporati in essi:

impostare

$ 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

6
Vedi anche ls -b, ls -Q, ls --quoting-style=....
Stephen Kitt,

E printf '%q\n'. (Entrambi GNU.)
dave_thompson_085

9

lssi comporta diversamente quando il suo output viene convogliato. Per esempio:

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

Quindi, se vuoi vedere tutti i tuoi *.tar.gzfile, uno per riga, puoi farlo:

ls *.tar.gz | cat

Ma cosa succede se non si desidera convogliare l'output? Cioè, c'è un modo per forzare lsl'output dei nomi di file su una riga senza eseguire il piping dell'output?

Sì, con l' -1interruttore. (Questo è un trattino con il numero 1.) Quindi puoi usare questi comandi:

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

7

O con GNU find:

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

In contrasto con lscon *essa cercherà .tar.gzi file in modo ricorsivo:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz

Perché -printf '%P\n'piuttosto che semplicemente -print- a quel punto funzionerà qualsiasi Posix compatibile find.
Martin Bonner supporta Monica il

@MartinBonner perché -printverrà aggiunto ./prima del nome file.
Arkadiusz Drabczyk,

4

Un po 'più rotonda e loopy modo:

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

EDIT: aggiunte virgolette per gestire strani nomi di file


5
touch -- '-e \a.tar.gz'per un motivo per citare le tue variabili e unix.stackexchange.com/q/65803/117549 per motivi di utilizzo di printf anziché echo
Jeff Schaller

oof, ho appena trascorso 5 minuti cercando di capire come rimuovere il -e \a.tar.gzfile risultante
scarica il

3
scusa! rm -- '-e \a.tar.gz'dovrebbe fare il trucco
Jeff Schaller

Sei bravo, è stata una lezione, e ho imparato che --funziona per rmmolti altri.
scarica il

@JeffSchaller: l'altra soluzione per i nomi locali èrm_etc './-x blah'
dave_thompson_085
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.