¿Cómo enumerar * .tar.gz, un nombre de archivo por línea?

8

Estoy tratando de enumerar cada .tar.gzarchivo, solo usando el siguiente comando:

ls *.tar.gz -l

... me muestra la siguiente lista:

-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

Sin embargo, solo necesito enumerarlo de esta manera:

file1.tar.gz 
file2.tar.gz

y tampoco:

file1.tar.gz file2.tar.gz

¿Cómo se hace esto "correctamente"?

McLan
fuente
66
Es una buena costumbre usar opciones antes de los nombres de archivo. y necesitas usar -1 en lugar de -l
AnonymousLurker
17
ls -1 *.tar.gz, Pero ¿qué es lo que desea utilizar la lista de ? Si está haciendo algo con esos nombres de archivo, entonces lsno es la forma correcta de hacerlo. Ver ¿Por qué * no * analizar `ls` (y qué hacer en su lugar)?
Kusalananda
3
El manual que necesitas es man ls. Asegúrese de que la fuente de la pantalla tenga un buen contraste entre 1 (uno) y l (letra minúscula ell).
ctrl-alt-delor

Respuestas:

39

La -1opción (el dígito "uno", no la "L" minúscula) mostrará un archivo por línea sin otra información:

ls -1 -- *.tar.gz
Stephen Kitt
fuente
1
¿Por qué los dobles guiones? ls -1 *.tar.gzfunciona igual de bien
RonJohn
8
@RonJohn evita sorpresas con nombres de archivos que comienzan con -.
Stephen Kitt
55
Específicamente ... decir que era un atacante, y tenía los siguientes archivos: .hiddenfile, benign.php, evil.bin, --hide=*evil*, sin el --no verás evil.bin o --hide=*evil* .
wizzwizz4
¡Estoy totalmente decepcionado de que no haya -2(o -3, etc.)! ;-)
Peter - Restablece a Mónica el
1
(... lo que me hizo mirar hacia arriba columns!)
Peter - Restablece a Mónica el
19

Si solo necesita los nombres de archivo, puede usar printf:

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

... el shell expandirá el *.tar.gzcomodín a los nombres de archivo, luego printflos imprimirá, con cada uno seguido de una nueva línea. Este resultado diferiría un poco del dels los nombres de archivo con nuevas líneas incrustadas en ellos:

preparar

$ 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
fuente
66
Véase también ls -b, ls -Q, ls --quoting-style=....
Stephen Kitt
Y printf '%q\n'. (Ambos GNU.)
dave_thompson_085
9

lsse comporta de manera diferente cuando su salida se canaliza. Por ejemplo:

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

Entonces, si desea ver todos sus *.tar.gzarchivos, uno por línea, puede hacer esto:

ls *.tar.gz | cat

Pero, ¿y si no quieres canalizar tu salida? Es decir, ¿hay alguna forma de forzar la lssalida de los nombres de archivo uno a una línea sin canalizar la salida?

Sí, con el -1interruptor. (Eso es un guión con el número 1.) Para que pueda usar estos comandos:

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

O con GNU find:

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

Al contrario que lscon *él, buscará .tar.gzarchivos de forma recursiva:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
Arkadiusz Drabczyk
fuente
Por qué, en -printf '%P\n'lugar de solo -print, en qué punto funcionará cualquier compatible con Posix find.
Martin Bonner apoya a Mónica el
@MartinBonner porque -printse agregará ./antes del nombre del archivo.
Arkadiusz Drabczyk
4

Una forma un poco más indirecta y en bucle :

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

EDITAR: citas agregadas para manejar nombres de archivos extraños

snetch
fuente
55
touch -- '-e \a.tar.gz'por una razón para citar sus variables y unix.stackexchange.com/q/65803/117549 por razones para usar printf en lugar de echo
Jeff Schaller
oof, acabo de pasar 5 minutos tratando de descubrir cómo eliminar el -e \a.tar.gzarchivo resultante
snetch
3
¡lo siento! rm -- '-e \a.tar.gz'debería hacer el truco
Jeff Schaller
Eres bueno, fue una lección, y aprendí que --funciona para rmmuchos otros.
snetch
@JeffSchaller: la otra solución para los nombres locales esrm_etc './-x blah'
dave_thompson_085