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)


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ą.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.