使用 docopt 将 'find' 命令的输出传递给 Python(空格问题)

Pass output of 'find' command to Python with docopt (issue with spaces)

考虑这个简单的 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>'])

考虑到我的文件夹中有以下文件:

现在我想将 find 命令的输出传递给我的简单命令行脚本。但是当我尝试

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

我没有得到我想要的文件列表,因为输入被空格分开了。 IE。我得到:

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

如何正确执行此操作?

这不是 Python 问题。这就是 shell 如何标记命令行。空格用于分隔命令参数,这就是为什么 file 2.pdf 显示为两个单独的参数。

您可以组合 findxargs 来执行您想要的操作:

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

find 的 -print0 参数告诉它输出由 ASCII NUL 字符而不是空格分隔的文件名,而 xargs-0 参数告诉它期望这种输入形式. xargs 然后用正确的参数调用你的 foobar 脚本。

比较:

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

收件人:

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