Как я могу передать имена файлов с пробелами в качестве аргументов?

11

У меня есть скрипт Python, который принимает строковые аргументы.

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

Это работает как ожидалось.

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


Если мне нужно передать имена файлов, я бы сделал,

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

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

Если использовать -Qв lsкоманде, я могу обернуть результаты между двойными кавычками. Тем не менее, кавычки остаются в скрипте Python, т.е.

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

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


Как мне развернуть lsимена файлов в соответствующие строки для использования в качестве аргументов? (как в моем самом первом примере)

автозапуск
источник
Вы должны процитировать расширение оболочки: "$(ls -Q '/some/dir/*.jpg')". Однако есть более лучшие альтернативы, как указано в ответах.
Бакуриу

Ответы:

23

Не разобрать ls. Просто используйте:

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

Это выполняет глобирование оболочки, которое заменяется /path/to/*.jpgсоответствующим списком.

DopeGhoti
источник
5

Я думаю , что Glob ответ выше всего, но xargsи findявляется также решением , которое может быть использовано иногда.

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

Это работает, потому что -print0on findразделит вывод нулевыми байтами, а не пробелами, а -0командная строка в xargs будет предполагать, что вход разделен нулевыми байтами.

davidsheldon
источник