Bash shell: liệt kê tất cả các tệp thuộc loại .png hoặc .PNG?


14

Trong tập lệnh bash, làm cách nào tôi có thể nói 'cho tất cả các tệp thuộc loại .png hoặc .PNG'?

Tôi đang cô găng :

for i in (`ls *.PNG` && `ls *.png`)

nhưng nhận được một lỗi cú pháp.

Câu trả lời:


18

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.


5
for i in *.{png,PNG}
glenn jackman

@glenn: Điều đó cũng hoạt động (tương đương với `* .png * .PNG), mặc dù bạn vẫn cần nullglob hoặc kiểm tra sự tồn tại.
Gordon Davisson

5

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.


1
Tuy nhiên, tìm kiếm theo mặc định là đệ quy, do đó, để có được kết quả tương tự câu hỏi, bạn phải làm find -maxdepth 1 -iname "*.png"
Yab

@Yab, bạn hoàn toàn chính xác. Tôi bỏ qua khía cạnh này.
Alain Pannetier

1

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ú:

  • Tôi giả sử bạn muốn cả hình ảnh chữ hoa và chữ thường. Dấu phân tách && có nghĩa là chỉ xử lý các tệp png nếu các tệp PNG tồn tại, điều này có thể không có ý nghĩa nhiều.
  • bạn sẽ có thông báo lỗi hiển thị nếu không tìm thấy tệp nào với một trong hai mẫu.
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.