Como listar * .tar.gz, um nome de arquivo por linha?

8

Estou tentando listar todos os .tar.gzarquivos, apenas usando o seguinte comando:

ls *.tar.gz -l

... Ele me mostra a seguinte 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

No entanto, eu só preciso listar desta maneira:

file1.tar.gz 
file2.tar.gz

e também não:

file1.tar.gz file2.tar.gz

Como isso é feito "corretamente"?

McLan
fonte
6
é um bom hábito usar opções antes dos nomes dos arquivos. e você precisa usar -1 em vez de -l
AnonymousLurker
17
ls -1 *.tar.gz, Mas o que você quiser usar a lista para ? Se você está fazendo algo com esses nomes de arquivos, lsnão é o caminho certo para fazê-lo. Veja Por que * not * analisa `ls` (e o que fazer em vez disso)?
Kusalananda
3
o manual que você precisa é man ls. Verifique se a fonte de exibição possui um bom contraste entre 1 (um) e l (letra minúscula ell).
Ctrl-alt-delor 27/11/19

Respostas:

39

A -1opção (o dígito "um", não o "L" minúsculo) listará um arquivo por linha sem outras informações:

ls -1 -- *.tar.gz
Stephen Kitt
fonte
1
Por que os traços duplos? ls -1 *.tar.gzfunciona tão bem.
RonJohn
8
@ RonJohn evita surpresas com nomes de arquivos começando com -.
Stephen Kitt
5
Especificamente ... dizer que eu era um atacante, e teve os seguintes arquivos: .hiddenfile, benign.php, evil.bin, --hide=*evil*, sem o que --você não verá evil.bin ou --hide=*evil* .
wizzwizz4
Estou totalmente desapontado por não haver -2(ou -3 etc.)! ;-)
Peter - Restabelece Monica
1
(... o que me fez olhar para cima columns!)
Peter - Restabelece Monica
19

Se você precisar apenas dos nomes dos arquivos, poderá usar printf:

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

... o shell expandirá o *.tar.gzcuringa para os nomes dos arquivos e printfos imprimirá, cada um seguido por uma nova linha. Essa saída seria um pouco diferente dals do caso de nomes de arquivos com novas linhas incorporadas:

configuração

$ 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
fonte
6
Veja também ls -b, ls -Q, ls --quoting-style=....
Stephen Kitt
E printf '%q\n'. (Ambos GNU.)
dave_thompson_085
9

lsse comporta de maneira diferente quando sua saída é canalizada. Por exemplo:

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

Portanto, se você quiser ver todos os seus *.tar.gzarquivos, um por linha, faça o seguinte:

ls *.tar.gz | cat

Mas e se você não quiser canalizar sua saída? Ou seja, existe uma maneira de forçar lsa saída dos nomes de arquivos um para uma linha sem canalizar a saída?

Sim, com o -1interruptor. (Isso é um traço com o número 1.) Portanto, você pode usar estes comandos:

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

Ou com GNU find:

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

Ao contrário de lscom *ele vai procurar .tar.gzarquivos de forma recursiva:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
Arkadiusz Drabczyk
fonte
Por -printf '%P\n'que, e não apenas -print- nesse ponto, qualquer compatível com Posix findfuncionará.
Martin Bonner apoia Monica
@MartinBonner porque -printserá adicionado ./antes do nome do arquivo.
Arkadiusz Drabczyk 29/11
4

Uma maneira um pouco mais indireta e irregular :

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

EDIT: aspas adicionadas para lidar com nomes de arquivos estranhos

arrebatar
fonte
5
touch -- '-e \a.tar.gz'por uma razão de citar suas variáveis e unix.stackexchange.com/q/65803/117549 por razões para uso printf em vez de echo
Jeff Schaller
oof, eu passei apenas 5 minutos tentando descobrir como remover o resultante -e \a.tar.gzarquivo
snetch
3
desculpa! rm -- '-e \a.tar.gz'deve fazer o truque
Jeff Schaller
Você é bom, foi uma lição, e eu aprendi que --funciona para rmmuitas outras pessoas.
snetch
@ JeffSchaller: a outra solução para nomes locais érm_etc './-x blah'
dave_thompson_085