Jak przekazać nazwy plików ze spacjami jako argumenty?

11

Mam skrypt w języku Python, który akceptuje argumenty łańcuchowe.

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

Działa to zgodnie z oczekiwaniami.

Argumenty w języku Python: ["one image.jpg", "another image.jpg"]


Gdybym musiał podać nazwy plików, zrobiłbym to,

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

Argumenty w języku Python: ["one", "image.jpg", "another", "image.jpg"]

Jeśli użyć -Qz lspoleceniem, mogę owinąć wyników między cudzysłowy. Jednak cytaty pozostają znakami ucieczki w skrypcie Python, tj.

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

Argumenty w języku Python: ['"one image.jpg"', '"another image.jpg"']


Jak rozwinąć lsnazwy plików do odpowiednich ciągów znaków, które będą używane jako argumenty? (jak w moim pierwszym przykładzie)

autorun
źródło
Należy podać rozszerzenie powłoki: "$(ls -Q '/some/dir/*.jpg')". Istnieją jednak lepsze alternatywy, jak stwierdzono w odpowiedziach.
Bakuriu

Odpowiedzi:

23

Nie parsuj ls. Po prostu użyj:

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

Wykonuje to globowanie powłoki, które zastępuje /path/to/*.jpgodpowiednią listą.

DopeGhoti
źródło
5

Myślę, że odpowiedź glob powyżej jest najlepszy, ale xargsi findto również rozwiązanie, które może być wykorzystywane czasem.

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

Działa to, ponieważ -print0on findrozdzieli dane wyjściowe bajtami zerowymi zamiast spacji, a -0linia poleceń xargs przyjmie, że dane wejściowe są oddzielone bajtami zerowymi.

davidsheldon
źródło