Bagaimana cara mendaftar * .tar.gz, satu nama file per baris?

8

Saya mencoba mendaftar setiap .tar.gzfile, hanya menggunakan perintah berikut:

ls *.tar.gz -l

... Ini menunjukkan kepada saya daftar berikut:

-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

Namun, saya hanya perlu mendaftar dengan cara ini:

file1.tar.gz 
file2.tar.gz

dan juga tidak:

file1.tar.gz file2.tar.gz

Bagaimana ini "benar" dilakukan?

McLan
sumber
6
itu kebiasaan yang baik untuk menggunakan opsi sebelum nama file. dan Anda perlu menggunakan -1 sebagai ganti -l
AnonymousLurker
17
ls -1 *.tar.gz, Tapi apa yang Anda ingin menggunakan daftar untuk ? Jika Anda melakukan sesuatu pada nama file itu, maka lsitu bukan cara yang tepat untuk melakukannya. Lihat Mengapa * tidak * parsing `ls` (dan apa yang harus dilakukan)?
Kusalananda
3
manual yang Anda butuhkan adalah man ls. Pastikan font tampilan Anda memiliki kontras yang baik antara 1 (satu) dan l (huruf kecil ell).
ctrl-alt-delor

Jawaban:

39

The -1pilihan (digit “satu”, tidak menurunkan kasus “L”) akan daftar satu file per baris dengan tidak ada informasi lain:

ls -1 -- *.tar.gz
Stephen Kitt
sumber
1
Mengapa garis ganda? ls -1 *.tar.gzberfungsi juga.
RonJohn
8
@RonJohn itu menghindari kejutan dengan nama file yang dimulai dengan -.
Stephen Kitt
5
Secara khusus ... Katakanlah saya adalah seorang penyerang, dan memiliki file-file berikut: .hiddenfile, benign.php, evil.bin, --hide=*evil*; tanpa --Anda tidak akan melihat evil.bin atau --hide=*evil* .
wizzwizz4
Saya sangat kecewa bahwa tidak ada -2(atau -3 dll)! ;-)
Peter - Reinstate Monica
1
(... yang membuatku melihat ke atas columns!)
Peter - Reinstate Monica
19

Jika Anda hanya membutuhkan nama file, Anda dapat menggunakan printf:

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

... shell akan memperluas *.tar.gzwildcard ke nama file, kemudian printfakan mencetaknya, dengan masing-masing diikuti oleh baris baru. Output ini akan sedikit berbeda darils dalam hal nama file dengan baris baru yang tertanam di dalamnya:

mendirikan

$ 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
sumber
6
Lihat juga ls -b, ls -Q, ls --quoting-style=....
Stephen Kitt
Dan printf '%q\n'. (Keduanya GNU.)
dave_thompson_085
9

lsberperilaku berbeda ketika outputnya disalurkan. Sebagai contoh:

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

Jadi jika Anda ingin melihat semua *.tar.gzfile Anda , satu per baris, Anda dapat melakukan ini:

ls *.tar.gz | cat

Tetapi bagaimana jika Anda tidak ingin menyalurkan output Anda? Yaitu, adakah cara untuk memaksa lsuntuk mengeluarkan nama file satu ke baris tanpa memipis output?

Ya, dengan -1sakelar. (Itu tanda hubung dengan angka 1.) Jadi, Anda dapat menggunakan perintah ini:

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

Atau dengan GNU find:

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

Sebaliknya lsdengan *itu akan mencari .tar.gzfile secara rekursif:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
Arkadiusz Drabczyk
sumber
Mengapa -printf '%P\n'alih-alih hanya -print- pada titik mana Posix yang kompatibel findakan bekerja.
Martin Bonner mendukung Monica
@ MartinBonner karena -printakan menambahkan ./sebelum nama file.
Arkadiusz Drabczyk
4

Sebuah sedikit lebih bundaran dan gila cara:

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

EDIT: menambahkan kutipan untuk menangani nama file aneh

ambil
sumber
5
touch -- '-e \a.tar.gz'untuk alasan mengutip variabel Anda dan unix.stackexchange.com/q/65803/117549 untuk alasan menggunakan printf alih-alih gema
Jeff Schaller
oof, saya hanya menghabiskan 5 menit untuk mencari tahu cara menghapus -e \a.tar.gzfile yang dihasilkan
snetch
3
Maaf! rm -- '-e \a.tar.gz'harus melakukan trik
Jeff Schaller
Anda baik, itu adalah pelajaran, dan saya memang belajar bahwa itu --berhasil rmdan banyak orang lain.
ambil
@JeffSchaller: solusi lain untuk nama lokal adalahrm_etc './-x blah'
dave_thompson_085