Передать вывод команды «найти» в Python с помощью docopt (проблема с пробелами)

Рассмотрим этот простой скрипт командной строки Python:

"""foobar
  Description

Usage:
  foobar [options] <files>...

Arguments:
  <files>         List of files.

Options:
  -h, --help      Show help.
      --version   Show version.
"""

import docopt

args = docopt.docopt(__doc__)
print(args['<files>'])

И учтите, что у меня есть следующие файлы в папке:

  • file1.pdf
  • file 2.pdf

Теперь я хочу передать вывод команды find моему простому сценарию командной строки. Но когда я пытаюсь

foobar `find . -iname '*.pdf'`

Я не получаю список файлов, которые мне нужны, потому что ввод разбит на пробелы. т.е. Я получил:

['./file', '2.pdf', './file1.pdf']

Как это сделать правильно?


person Tom de Geus    schedule 17.01.2020    source источник


Ответы (1)


Это не вопрос Python. Это все о том, как оболочка токенизирует командные строки. Пробелы используются для разделения аргументов команды, поэтому file 2.pdf отображается как два отдельных аргумента.

Вы можете комбинировать find и xargs, чтобы делать то, что хотите, вот так:

find . -iname '*.pdf' -print0 | xargs -0 foobar

Аргумент -print0 для поиска говорит ему выводить имена файлов, разделенные символами ASCII NUL, а не пробелами, а аргумент -0 для xargs говорит ему ожидать такой формы ввода. xargs, затем вызовите свой foobar скрипт с правильными аргументами.

Сравнивать:

$ ./foobar $(find . -iname '*.pdf' )
['./file', '2.pdf', './file1.pdf']

To:

$ find .  -iname '*.pdf' -print0 | xargs -0 ./foobar
['./file 2.pdf', './file1.pdf']
person larsks    schedule 17.01.2020