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

7

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

ls *.tar.gz -l

... Mostra-me 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, só preciso listar dessa maneira:

file1.tar.gz 
file2.tar.gz

e também não:

file1.tar.gz file2.tar.gz

Como isso é feito "corretamente"?

    
por McLan 27.11.2018 / 17:51

5 respostas

38

A opção -1 (o dígito "one", e não minúscula "L") listará um arquivo por linha sem nenhuma outra informação:

ls -1 -- *.tar.gz
    
por 27.11.2018 / 17:52
19

Se você precisa apenas dos nomes dos arquivos, você pode usar printf :

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

... o shell expandirá o caractere curinga *.tar.gz para os nomes dos arquivos e, em seguida, printf os imprimirá, cada um seguido por uma nova linha. Essa saída pode diferir um pouco de a de ls no caso de nomes de arquivos com novas linhas incorporadas neles:

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
    
por 27.11.2018 / 18:03
9

ls se 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

Então, se você quiser ver todos os seus arquivos *.tar.gz , um por linha, você pode fazer isso:

ls *.tar.gz | cat

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

Sim, com a opção -1 . (Isso é um traço com o número 1.) Então 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
    
por 27.11.2018 / 23:47
7

Ou com GNU find :

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

Ao contrário de ls com * , ele procurará por .tar.gz arquivos recursivamente:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
    
por 27.11.2018 / 22:01
4

Um caminho um pouco mais indireto e loopy :

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

EDIT: citações adicionadas para lidar com nomes de arquivos estranhos

    
por 27.11.2018 / 21:38

Tags