Làm thế nào tôi có thể vượt qua tên tệp với không gian làm đối số?


11

Tôi có một kịch bản Python chấp nhận các đối số chuỗi.

$ python script.py "one image.jpg" "another image.jpg"

Điều này hoạt động như mong đợi.

Đối số Python: ["one image.jpg", "another image.jpg"]


Nếu tôi cần vượt qua tên tập tin tôi sẽ làm,

$ python script.py $(ls "/some/dir/*.jpg")

Đối số Python: ["one", "image.jpg", "another", "image.jpg"]

Nếu sử dụng -Qcác lslệnh, tôi có thể quấn kết quả giữa dấu ngoặc kép. Tuy nhiên, dấu ngoặc kép vẫn thoát trong tập lệnh Python, tức là.

$ python script.py $(ls -Q "/some/dir/*.jpg")

Đối số Python: ['"one image.jpg"', '"another image.jpg"']


Làm cách nào để mở rộng lstên tệp thành các chuỗi thích hợp để sử dụng làm đối số? (như trong ví dụ đầu tiên của tôi)


Bạn nên trích dẫn mở rộng vỏ : "$(ls -Q '/some/dir/*.jpg')". Tuy nhiên, có những lựa chọn thay thế tốt hơn như được nêu trong các câu trả lời.
Bakuriu

Câu trả lời:


23

Đừng phân tích cú pháp ls. Chỉ dùng:

python script.py /path/to/*.jpg

Điều này thực hiện shellbing mà thay thế /path/to/*.jpgbởi danh sách thích hợp.


5

Tôi nghĩ câu trả lời glob trên là tốt nhất, nhưng xargsfindcũng là một giải pháp mà có thể được sử dụng đôi khi.

find /some/dir/ -name '*.jpg' -print0 | xargs -0 python script.py

Điều này hoạt động vì -print0trên findsẽ phân tách đầu ra bằng byte rỗng thay vì khoảng trắng và -0dòng lệnh trên xargs sẽ cho rằng đầu vào được phân tách bằng byte rỗng.

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.