Daftar kisaran file dengan wildcard UNIX

14

Katakan misalnya saya memiliki file berikut di direktori kerja saya: mjk0001.fits, mjk0002.fits, ... secara numerik meningkatkan semua jalan ke mjk9999.fits.

Apakah ada cara untuk menggunakan wildcard UNIX untuk mendaftar atau beroperasi pada kelompok berurutan dari mereka? Misalnya, jika saya perlu menjalankan proses pada 0025 hingga 0050, format apa yang akan saya gunakan?

Saya sudah mencoba yang berikut tetapi tidak berhasil:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

Terima kasih sebelumnya, semuanya, MK

Matt Keene
sumber
Untuk referensi: pencocokan pola , globbing
ignis

Jawaban:

20

Anda dapat menggunakan ekspansi brace:

ls mjk00{25..50}.fits

Nol terkemuka dapat dimasukkan jika perlu:

ls mjk0{000..149}.fits
chepner
sumber
1
Menggunakan sintaks ini, Anda juga dapat menentukan nilai langkah: {25..50..2}.
nobar
1

Tidak secara langsung, tetapi Anda dapat menggunakan beberapa pola bola:

ls mjk002[56789].fits mjk00[34]?.fits

Ini bukan apa yang Anda cari, tapi ini adalah hal terdekat yang ditawarkan pola glob, dan tentu saja lebih baik daripada mengetik setiap sistem file. Setidaknya jumlah pola yang Anda perlukan per rentang numerik dibatasi oleh log titik akhir numerik dari rentang tersebut.

Celada
sumber
1

Anda bisa menggunakan regex dengan grep. Saya bukan guru regex. Berikut ini mengembalikan pola dengan angka antara 25-50:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

Saya tidak tahu apakah itu mungkin dan bagaimana akhirnya menyamaratakan ini dengan grep.

Heisenbug
sumber
0

Dimungkinkan untuk mencapai portabilitas atau fleksibilitas yang lebih besar dengan menggunakan forloop dan printf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

Ini menangani ruang dengan baik dan hasilnya cocok untuk perpipaan xargsuntuk diproses lebih lanjut.

Angka dengan banyak kecocokan akan menghasilkan semua file yang cocok terdaftar.

Angka tanpa kecocokan akan melaporkan kesalahan pada stderr, tetapi ||truemenekan kembalinya tingkat bash.


Namun dalam kasus dasar, menggunakan fordan printftidak berbeda dari yang lebih ringkas:

ls --escape mjk{0025..0050..1}* ||true
bangsawan
sumber
Jika Anda ingin memisahkan hasil ekspansi brace, Anda dapat menggunakan for for loop:for i in {025..050} ; do ... ; done
nob