Cara terbaik untuk memperluas pola glob?

29

Saya perlu memperluas pola gumpalan (seperti ../smth*/*, atau /etc/cron*/) ke dalam daftar file, secara terprogram. Apa cara terbaik untuk melakukannya?

Rogach
sumber
2
Anda tidak perlu melakukan sesuatu yang istimewa, hanya saja jangan mengutip *.
Kevin
1
Meskipun jika Anda akan mencoba menguraikannya, gunakan array seperti yang dikatakan jawabannya.
Kevin

Jawaban:

40

Biarkan saja diperluas di sisi kanan deklarasi array:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Perhatikan bahwa opsi shell nullglobperlu diatur.
Ini tidak diatur secara default.
Ini mencegah kesalahan jika glob (atau salah satu dari banyak gumpalan) tidak cocok dengan nama apa pun.

Atur bashdengan

shopt -s nullglob

atau zshdengan

setopt nullglob
manatwork
sumber
Dan bagaimana cara mencetak daftar itu sesudahnya?
Rogach
Ini hanya array biasa. Anda dapat melakukan apapun yang Anda bisa dengan array apa pun. Menambahkan beberapa contoh.
manatwork
1
Ada masalah. Jika pola tidak cocok dengan file, ia mencetak sendiri - yang tidak terlalu baik.
Rogach
5
Ah, shopt -s nullglob menyelesaikannya.
Rogach
1
@ lindhe, unsetoptdan parameter yang sama seperti yang digunakan untuk setopt.
manatwork
-1

Tidak perlu terlalu rumit:

echo your/stuff*
Alexei Averchenko
sumber
ini tidak berhasil. Misalnya: TEST=$(echo your/stuff*) && eval \"$TEST\"akan menampilkan:your/stuff*: No such file or directory
Sebastian
@Sebastian ini adalah masalah nullglob, lihat di atas
Alexei Averchenko
1
Tidak, ini bukan masalah nullglob. Menggunakan karakter scape mengevaluasi TESTvariabel sebagai string termasuk *dan tidak diperluas.
Sebastian