Como posso passar nomes de arquivos com espaços como argumentos?


11

Eu tenho um script Python que aceita argumentos de seqüência de caracteres.

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

Isso funciona conforme o esperado.

Argparse do Python: ["one image.jpg", "another image.jpg"]


Se eu precisar passar nomes de arquivos, eu faria,

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

Argparse do Python: ["one", "image.jpg", "another", "image.jpg"]

Se usar o comando -Qof ls, posso agrupar os resultados entre aspas duplas. No entanto, as aspas permanecem escapadas no script Python, ie.

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

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


Como devo expandir os lsnomes de arquivos em strings apropriadas para usar como argumentos? (como no meu primeiro exemplo)


Você deve citar a expansão shell: "$(ls -Q '/some/dir/*.jpg')". No entanto, existem alternativas melhores, conforme indicado pelas respostas.
Bakuriu 17/08/16

Respostas:


23

Não analise ls. Apenas use:

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

Isso realiza a ocultação de shell que é substituída /path/to/*.jpgpela lista apropriada.


5

Acho que a resposta glob acima é melhor, mas xargse findtambém é uma solução que pode ser utilizada, por vezes.

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

Isso funciona porque -print0on findseparará a saída com bytes nulos, em vez de espaços, e a -0linha de comando xargs assumirá que a entrada é separada por bytes nulos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.