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

11

Eu tenho um script Python que aceita argumentos de string.

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

Isso funciona como esperado.

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

Se eu precisar passar nomes de arquivos, eu faria

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

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

Se você usar o comando -Q de ls , posso encapsular os resultados entre aspas duplas. No entanto, aspas ficam com escape no script Python, ou seja,

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

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

Como devo expandir ls nomes de arquivos em seqüências adequadas para usar como argumentos? (como no meu primeiro exemplo)

    
por autorun 17.08.2016 / 06:51

2 respostas

24

Não analise ls . Apenas use:

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

Isso realiza a globalização shell, que substitui /path/to/*.jpg pela lista correta.

    
por DopeGhoti 17.08.2016 / 07:26
5

Acho que a resposta da glob acima é melhor, mas xargs e find também é uma solução que pode ser usada às vezes.

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

Isso funciona porque -print0 on find separará a saída com bytes nulos em vez de espaços, e o -0 na linha de comando xargs assumirá que a entrada está separada por bytes nulos.

    
por davidsheldon 17.08.2016 / 14:32