Передать вывод команды 'find' в Python с помощью docopt (проблема с пробелами) - PullRequest
0 голосов
/ 17 января 2020

Рассмотрим этот простой 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']

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

1 Ответ

1 голос
/ 17 января 2020

Это не 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']

Кому:

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