Làm thế nào để đặt các tệp cụ thể từ một thư mục trong một mảng trong bash?


7

Giả sử tôi có một thư mục theo đó có 3 tệp có tên: file1.txt, file2.txt và file3.txt.

Bây giờ làm thế nào tôi có thể điền vào một mảng với các tên tệp đó (tôi chỉ biết rằng tất cả các tệp có tiền tố nhất định, tức là tệp, sau tệp có thể là 1,2,3, v.v.


Nếu bạn biết tên bạn có nghĩa là gì khi 'tìm'? Bạn có muốn tạo một mảng với ba chuỗi trong đó không?
Matteo

A = (tệp *); echo $ {A [@]}
daisy

Tôi đã chỉnh sửa lời giải thích của tôi ở trên.
Nawshad Farruque

Câu trả lời:


8

Từ Wiki của Greg: mục Bash Guide trên mảng :

files=()
while read -r -d $'\0'; do
    files+=("$REPLY")
done < <(find *.txt -print0)

Có một lời giải thích chi tiết về các mảng trên trang phá vỡ cấu trúc này xuống từng phần tử; nó cũng đáng đọc toàn bộ.


Tìm kiếm là không cần thiết với ví dụ của bạn, nhưng nó vẫn hoàn thành công việc bằng cách chứng minh một cách an toàn để sử dụng find để điền vào một mảng +1. Một lưu ý là không phải tất cả các phiên bản tìm kiếm hỗ trợ -print0.
jordanm

Bạn đúng rồi. Do thiếu chi tiết xung quanh vấn đề thực tế, tôi nghĩ tốt hơn nên chuyển OP đến Wooledge Wiki để giải thích kỹ hơn.
jasonwryan

Như thường lệ trên kênh #bash IRC có thành viên duy trì wiki đó, tôi đồng ý.
jordanm

5

Nếu tất cả các tệp trong cùng một thư mục, bạn có một số tùy chọn khác ngoài câu trả lời của jasonwryan.

Sử dụng toàn cầu:

files=(file[0-9].txt)

Chỉ khớp với các tệp ví dụ trong câu hỏi:

files=(file[1-3].txt)

Nếu bạn có bash phiên bản 4 trở lên, bạn thậm chí có thể đệ quy toàn cầu:

shopt -s globstar
files=(**/file[0-9].txt)

Sử dụng mở rộng dấu ngoặc để giới hạn mảng của bạn chỉ trong các tệp ví dụ của bạn:

files=(file{1..3}.txt)

Không giống như hai ví dụ khác, điều này sẽ điền vào các tên tệp, ngay cả khi chúng không tồn tại. Vì lý do này, việc mở rộng cú đúp có thể không được mong muốn.

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.