Di Bash, apakah ekspansi wildcard dijamin dalam urutan?

54

Apakah perluasan wildcard di Bash dijamin dalam urutan abjad? Saya dipaksa untuk membagi file besar menjadi potongan-potongan 10 Mb sehingga mereka dapat diterima oleh repositori Mercurial saya.

Jadi saya berpikir saya bisa menggunakan:

split -b 10485760 Big.file BigFilePiece.

dan kemudian di tempat:

cat BigFile | bigFileProcessor

Saya bisa melakukan:

cat BigFilePiece.* | bigFileProcessor

di tempatnya.

Namun, saya tidak dapat menemukan tempat yang menjamin bahwa perluasan tanda bintang (alias wildcard, alias *) akan selalu dalam urutan alfabet sehingga .aadatang sebelum .ab(sebagai lawan dari pemesanan timestamp atau sesuatu seperti itu).

Juga, apakah ada kekurangan dalam rencana saya? Seberapa hebat biaya kinerja dari catmenggabungkan file?

Kereta luncur
sumber
4
Pasti Anda mengambil pendekatan yang salah. Jika admin memberi batasan untuk ukuran file yang Anda miliki di repositori, maka Anda harus berbicara dengannya. Berbicara tentang ekspansi - Saya selalu melihat bahwa ekspansi itu alfanumerik.
Mircea Vutcovici
1
Anda selalu dapat mengirim melalui pipa sortjika Anda memerlukan manipulasi pesanan tambahan.
Warner
2
Harap dicatat bahwa Mercurial dapat mengelola file dalam ukuran apa pun, dibatasi oleh jumlah RAM yang Anda miliki. Anda mendapat peringatan jika Anda menambahkan file besar, karena Mercurial berasumsi bahwa itu dapat menyimpan file dalam memori. Untuk penggabungan, Mercurial perlu menyimpan dua file dalam memori. Mesin dengan jumlah RAM kecil karenanya dapat mengalami kesulitan memeriksa file. Saya baru saja mengujinya, dan hg commitpada Nfile MB membutuhkan sekitar 3 * NMB RAM dan hg updatemembutuhkan sekitar 2 * NMB RAM. Ini dengan Mercurial 1.5 di Linux.
Martin Geisler

Jawaban:

67

Ya, ekspansi globbing bersifat alfabet.

Dari manhalaman Bash :

Perluasan Pathname

Setelah kata membelah, kecuali -fopsi telah ditetapkan, bash memindai setiap kata untuk karakter *, ?dan [. Jika salah satu karakter ini muncul, maka kata tersebut dianggap sebagai pola, dan diganti dengan daftar nama file yang diurutkan berdasarkan abjad yang cocok dengan pola tersebut.

Dennis Williamson
sumber
@ Dennis Williamson, Ada ide apakah ini masih benar jika pengguna memiliki set bahasa yang berbeda?
Zoredache
5
@Zoredache: Sebenarnya ditentukan oleh POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html "Nama path dalam urutan seperti ditentukan oleh pengaturan saat ini dari kategori LC_COLLATE, lihat spesifikasi XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd / ... "dan itulah mengapa Anda harus melakukan hal-hal seperti ls -l [[:lower:]]bukan ls -l [a-z].
Dennis Williamson
Perhatikan bahwa urutannya adalah abjad sehingga BigFilePiece.10 akan datang sebelum BigFilePiece.2
Ken
@DennisWilliamson - Mengapa dua pasang tanda kurung? Seseorang tampaknya bekerja persis sama dengan saya.
ArtOfWarfare
2
@ArtOfWarfare: Coba ini: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. File "z" hanya terdaftar oleh yang kedua lskarena meminta nama file huruf tunggal lebih kecil. Yang pertama ls- yang tanpa tanda kurung kotak luar - meminta nama file karakter tunggal dari daftar karakter ":", "l", "o", "w", "e", dan "r". Dalam kedua kasus tanda kurung terluar membatasi ekspresi braket yang mencantumkan karakter dan kelas. Dalam kasus [[:lower:]], kurung kotak bagian dalam, titik dua dan kata nama kelas karakter. ...
Dennis Williamson
4

Itu adalah perilaku yang didokumentasikan bashsehingga Anda dapat bergantung padanya dalam skrip Anda. Hal ini juga berlaku untuk cangkang Bourne lain yang kompatibel untuk waktu yang sangat lama ... meskipun mungkin ada kasus sudut tentang kasus lipat atau karakter non-alfanumerik.

(Daftar yang dihasilkan, dalam bashakan berada di urutan hampir "ASCII-betical" --- kecuali bahwa huruf kecil dan huruf besar akan disusun bersama seolah-olah tidak ada perbedaan huruf tetapi dengan huruf kecil disusun sebelum setara huruf besar mereka. Semua non -alfabet harus disusun dalam urutan yang sama seperti yang muncul di ASCII).

Seperti yang telah ditunjukkan orang lain, ini bisa terganggu oleh pengaturan lingkungan terkait bahasa Anda: LANG secara umum dan LC_COLLATE lebih spesifik. In mungkin paling aman untuk menjalankan perintah yang bergantung pada pemesanan ekspansi global di bawah envperintah untuk membersihkan lingkungan (menggunakan -iatau -ujika perlu) atau menyalurkan hasilnya sortuntuk memastikan urutan yang kuat.

Jim Dennis
sumber
4
Tampaknya semua non-alfanumerik diabaikan dalam proses penyortiran. Jadi "=", "_", "~" tidak dapat digunakan untuk memaksa file untuk memulai atau mengakhiri (masing-masing) daftar.
Otheus
3

Sementara ekspansi glob diurutkan berdasarkan abjad, mereka juga mematuhi pengaturan bahasa shell.

Pastikan untuk mengatur ini ke "C" di skrip Anda jika Anda bermaksud ini portabel.

adaptr
sumber