Cách tốt nhất để mở rộng mô hình toàn cầu?


29

Tôi cần mở rộng một mẫu toàn cầu (như ../smth*/*, hoặc /etc/cron*/) thành một danh sách các tệp, theo lập trình. Điều gì sẽ là cách tốt nhất để làm điều đó?


2
Bạn không cần phải làm gì đặc biệt, chỉ cần không trích dẫn *.
Kevin

1
Mặc dù nếu bạn đang cố phân tích nó, hãy sử dụng một mảng như câu trả lời.
Kevin

Câu trả lời:


40

Chỉ cần để nó mở rộng bên trong một bên phải của khai báo mảng:

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


Lưu ý rằng tùy chọn shell nullglobcần được đặt.
Nó không được đặt theo mặc định.
Nó ngăn ngừa một lỗi trong trường hợp toàn cầu (hoặc một trong nhiều khối) không khớp với bất kỳ tên nào.

Đặt nó bashvới

shopt -s nullglob

hoặc trong zshvới

setopt nullglob

Và làm thế nào để tôi in danh sách đó sau đó?
Rogach

Nó chỉ là một mảng thông thường. Bạn có thể làm bất cứ điều gì bạn có thể với bất kỳ mảng. Đã thêm một số ví dụ.
manatwork

1
Có một vấn đề. Nếu mẫu không khớp với tệp, nó sẽ tự in - điều này không tốt lắm.
Rogach

5
Ah, shopt -s nullglob giải quyết nó.
Rogach

1
@lindhe, unsetoptvà cùng tham số như được sử dụng cho setopt.
manatwork

0

Không cần phải quá phức tạp mọi thứ:

echo your/stuff*

cái này không hoạt động. Ví dụ: TEST=$(echo your/stuff*) && eval \"$TEST\"sẽ xuất:your/stuff*: No such file or directory
Sebastian

@Sebastian đây là một vấn đề nullglob, xem ở trên
Alexei Averchenko

1
Không, đó không phải là vấn đề nullglob. Sử dụng các ký tự scape là đánh giá TESTbiến dưới dạng một chuỗi bao gồm *và không được mở rộng.
Sebastian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.