cho rủi ro vòng lặp toàn cầu


10

Tôi đang cố gắng thiết lập một tập lệnh sẽ lặp qua một tập các thư mục và thực hiện một điều khi nó tìm thấy các tệp .jpg và một tập lệnh khác khi nó tìm thấy các tập tin .nef. Vấn đề là, nếu một thư mục không có tệp .jpg chẳng hạn (hoặc .nef) thì mục nhập toàn cầu không còn là một thế giới mở rộng, mà chỉ là một chuỗi. Ví dụ:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

nếu thư mục my_dir có tệp .JPG trong đó, thì chúng sẽ được lặp lại chính xác trên dòng lệnh.

pictures/one.JPG
pictures/two.JPG

Tuy nhiên, nếu my_dir không có tệp .JPG, thì vòng lặp sẽ nhập cho một lần lặp và echo:

pictures/*.JPG

Làm thế nào để tôi xây dựng cái này để nếu toàn cầu không có kết quả khớp, nó không vào vòng lặp for?

Câu trả lời:


17

Đây là hành vi bình thường và mặc định: Nếu Globing không khớp với bất kỳ tệp / thư mục nào, ký tự toàn cầu ban đầu sẽ được giữ nguyên.

Thay vào đó, nếu bạn muốn lấy lại kết quả trống, bạn có thể đặt nullglobtùy chọn trong tập lệnh của mình như sau:

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

Bạn có thể vô hiệu hóa nó sau đó với:

$ shopt -u nullglob

6

Bước sang một bên, sử dụng findcũng có thể hữu ích ở đây nếu lệnh bạn đang chạy cho các tệp đủ đơn giản để thả trên một dòng. Tìm có thể có một số đường dẫn để tìm và cũng sẽ vui vẻ tìm thấy bất kỳ tệp nào trong thư mục con.

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(Lệnh được thực thi được đưa ra sau -execcờ, kết thúc bằng ;. Được {}thay thế bằng tên của tệp hiện tại.)


3

thêm dòng này vào đầu tập lệnh của bạn

shopt -s nullglob
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.