Bagaimana saya bisa memberikan nama file dengan spasi sebagai argumen?

11

Saya memiliki skrip Python yang menerima argumen string.

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

Ini berfungsi seperti yang diharapkan.

Python argparse: ["one image.jpg", "another image.jpg"]


Jika saya harus memberikan nama file yang akan saya lakukan,

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

Python argparse: ["one", "image.jpg", "another", "image.jpg"]

Jika menggunakan -Qdari lsperintah, saya bisa membungkus hasil antara tanda kutip ganda. Namun, kutipan tetap lolos dalam skrip Python, yaitu.

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

Python argparse: ['"one image.jpg"', '"another image.jpg"']


Bagaimana saya harus memperluas lsnama file menjadi string yang tepat untuk digunakan sebagai argumen? (seperti pada contoh pertama saya)

autorun
sumber
Anda harus mengutip ekspansi shell: "$(ls -Q '/some/dir/*.jpg')". Namun ada alternatif yang lebih baik sebagaimana dinyatakan oleh jawaban.
Bakuriu

Jawaban:

23

Jangan diuraikan ls. Cukup gunakan:

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

Ini melakukan shell globbing yang menggantikan /path/to/*.jpgdengan daftar yang tepat.

DopeGhoti
sumber
5

Saya pikir jawaban glob di atas adalah yang terbaik, tetapi xargsdan findjuga merupakan solusi yang kadang-kadang dapat digunakan.

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

Ini berfungsi karena -print0pada findakan memisahkan output dengan null byte daripada spasi, dan -0pada baris perintah xargs akan menganggap input dipisahkan oleh null byte.

davidsheldon
sumber