Câu trả lời:
Nếu bạn muốn tất cả các kết hợp có thể, sử dụng:
for i in *.[Pp][Nn][Gg]; do
hoặc là
shopt -s nocaseglob
for i in *.png; do
mặc dù điều đó sẽ làm cho tất cả các khối vỏ của tập lệnh của bạn (ví dụ như khớp tập tin ký tự đại diện) không nhạy cảm cho đến khi bạn chạy shopt -u nocaseglob
.
Nếu bạn thực sự muốn chỉ .PNG và .png (và không, ví dụ: .PnG hoặc .pnG), thì hãy sử dụng một trong hai
shopt -s nullglob
for i in *.png *.PNG; do
hoặc là
for i in *.png *.PNG; do
[[ -e "$i" ]] || continue
... Lý do cho nullglob hoặc kiểm tra sự tồn tại là nếu bạn chỉ có các phần mở rộng chữ thường hoặc chỉ các phần mở rộng chữ hoa, nó sẽ bao gồm mẫu không khớp trong danh sách các tệp, dẫn đến lỗi trong phần thân của vòng lặp. Như với nocaseglob, bạn có thể muốn tắt tùy chọn shell nullglob sau đó (mặc dù theo kinh nghiệm của tôi có nullglob thường là tốt, đặc biệt là trong một tập lệnh). Trên thực tế, tôi thay vì coi đó là một ý tưởng tốt để sử dụng nocaseglob hoặc kiểm tra sự tồn tại cho tất cả các kết quả khớp tệp như thế này, chỉ trong trường hợp không có kết quả khớp.
Bạn cũng có thể thử một số lót như
tìm thấy . -tên "* .png" -exec ....
hoặc là
tìm thấy . -tên "* .png" | xargs ....
Chỉnh sửa
Xem thêm bình luận của @ Yab bên dưới về đệ quy.
find -maxdepth 1 -iname "*.png"
ls
ở đây gần như vô dụng nhưng đối với bản ghi ở đây là một cú pháp gần với nỗ lực của bạn hơn:
for i in $(ls *.PNG ; ls *.png)
Ghi chú:
for i in *.{png,PNG}