Comment lister * .tar.gz, un nom de fichier par ligne?

8

J'essaie de répertorier chaque .tar.gzfichier, en utilisant uniquement la commande suivante:

ls *.tar.gz -l

... Il me montre la liste suivante:

-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

Cependant, je dois juste l'énumérer de cette façon:

file1.tar.gz 
file2.tar.gz

et pas non plus:

file1.tar.gz file2.tar.gz

Comment cela se fait-il "correctement"?

McLan
la source
6
c'est une bonne habitude d'utiliser les options avant les noms de fichiers. et vous devez utiliser -1 au lieu de -l
AnonymousLurker
17
ls -1 *.tar.gz, Mais que voulez - vous utiliser la liste pour ? Si vous faites quelque chose pour ces noms de fichiers, ce lsn'est pas la bonne façon de le faire. Voir Pourquoi * pas * analyser `ls` (et que faire à la place)?
Kusalananda
3
le manuel dont vous avez besoin est man ls. Assurez-vous que votre police d'affichage présente un bon contraste entre 1 (un) et l (lettre minuscule ell).
ctrl-alt-delor

Réponses:

39

L' -1option (le chiffre «un», et non «L» en minuscules) listera un fichier par ligne sans aucune autre information:

ls -1 -- *.tar.gz
Stephen Kitt
la source
1
Pourquoi les doubles tirets? ls -1 *.tar.gzfonctionne aussi bien.
RonJohn
8
@RonJohn, il évite les surprises avec les noms de fichiers commençant par -.
Stephen Kitt
5
Plus précisément ... dire que je un attaquant, et avait les fichiers suivants: .hiddenfile, benign.php, evil.bin, --hide=*evil*; sans le --vous ne verrez pas evil.bin ou --hide=*evil* .
wizzwizz4
Je suis totalement déçu qu'il n'y en ait pas -2(ou -3 etc.)! ;-)
Peter - Rétablir Monica
1
(... ce qui m'a fait lever les yeux columns!)
Peter - Rétablir Monica
19

Si vous n'avez besoin que des noms de fichiers, vous pouvez utiliser printf:

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

... le shell étendra le *.tar.gzcaractère générique aux noms de fichiers, puis printfles imprimera, chacun étant suivi d'une nouvelle ligne. Cette sortie serait légèrement différente de celle dels dans le cas des noms de fichiers avec des retours à la ligne intégrés:

installer

$ 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
la source
6
Voir aussi ls -b, ls -Q, ls --quoting-style=....
Stephen Kitt
Et printf '%q\n'. (Les deux GNU.)
dave_thompson_085
9

lsse comporte différemment lorsque sa sortie est canalisée. Par exemple:

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

Donc, si vous voulez voir tous vos *.tar.gzfichiers, un par ligne, vous pouvez le faire:

ls *.tar.gz | cat

Mais que faire si vous ne voulez pas diriger votre sortie? Autrement dit, existe-t-il un moyen de forcer la lssortie des noms de fichiers un vers une ligne sans canaliser la sortie?

Oui, avec l' -1interrupteur. (C'est un tiret avec le numéro 1.) Vous pouvez donc utiliser ces commandes:

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

Ou avec GNU find:

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

Contrairement à lsavec *elle recherchera des .tar.gzfichiers récursive:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
Arkadiusz Drabczyk
la source
Pourquoi -printf '%P\n'plutôt que juste -print- à quel moment tout compatible Posix findfonctionnera.
Martin Bonner soutient Monica
@MartinBonner car -printajoutera ./avant le nom de fichier.
Arkadiusz Drabczyk
4

Une façon un peu plus détournée et bouclée :

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

EDIT: ajout de guillemets pour gérer les noms de fichiers étranges

snetch
la source
5
touch -- '-e \a.tar.gz'pour une raison de citer vos variables et unix.stackexchange.com/q/65803/117549 pour des raisons d'utiliser printf au lieu d'echo
Jeff Schaller
oof, je viens de passer 5 minutes à essayer de comprendre comment supprimer le -e \a.tar.gzfichier résultant
snetch
3
Désolé! rm -- '-e \a.tar.gz'devrait faire l'affaire
Jeff Schaller
Vous êtes bon, c'était une leçon, et j'ai appris que ça --marche pour rmbeaucoup d'autres.
snetch
@JeffSchaller: l'autre solution pour les noms locaux estrm_etc './-x blah'
dave_thompson_085