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)

autorun
fonte
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.

DopeGhoti
fonte
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.

davidsheldon
fonte