¿Cómo puedo pasar nombres de archivos con espacios como argumentos?

11

Tengo un script de Python que acepta argumentos de cadena.

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

Esto funciona como se esperaba.

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


Si necesito pasar nombres de archivo, lo haría,

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

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

Si uso el comando -Qof ls, puedo ajustar los resultados entre comillas dobles. Sin embargo, las citas se escapan en el script de Python, es decir.

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

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


¿Cómo debo expandir los lsnombres de archivo en cadenas adecuadas para usar como argumentos? (como en mi primer ejemplo)

ejecución automática
fuente
Usted debe citar el desarrollo del forro: "$(ls -Q '/some/dir/*.jpg')". Sin embargo, hay mejores alternativas como se indica en las respuestas.
Bakuriu

Respuestas:

23

No analizar ls. Solo usa:

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

Esto lleva a cabo el bloqueo de shell que reemplaza /path/to/*.jpgpor la lista adecuada.

DopeGhoti
fuente
5

Creo que la respuesta pegote anterior es mejor, pero xargsy findtambién es una solución que se puede utilizar a veces.

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

Esto funciona porque -print0on findseparará la salida con bytes nulos en lugar de espacios, y -0en la línea de comando xargs asumirá que la entrada está separada por bytes nulos.

davidsheldon
fuente