我有一个接受-f
标志的python脚本,并附加了该标志的多次使用。
例如,如果我运行python myscript -f file1.txt -f file2.txt
,我会有一个文件列表files=['file1.txt', 'files2.txt']
。这很好用,但我想知道如何自动使用find命令的结果来附加与文件一样多的-f
标志。
我试过了:
find ./ -iname '*.txt' -print0 | xargs python myscript.py -f
但它只抓取第一个文件
答案 0 :(得分:2)
需要注意的是,如果有多个文件超出单个命令行,则会失败(而xargs
会多次运行myscript.py
,每个文件都包含完整参数列表的子集):
#!/usr/bin/env bash
args=( )
while IFS= read -r -d '' name; do
args+=( -f "$name" )
done < <(find . -iname '*.txt' -print0)
python myscript.py "${args[@]}"
如果您希望以容忍任意数量文件名的方式安全,最好使用长格式选项 - 例如--file
而不是-f
=
- 使用xargs
分隔符,允许将单个名称作为同一argv条目的一部分传递,从而防止#!/usr/bin/env bash
# This requires -printf, a GNU find extension
find . -iname '*.txt' -printf '--file=%p\0' | xargs -0 python myscript.py
将文件名与其前面的符号分开:< / p>
#!/usr/bin/env bash
# requires find -print0 and xargs -0; these extensions are available on BSD as well as GNU
find . -iname '*.txt' -print0 |
while IFS= read -r -d '' f; do printf '--file=%s\0' "$f"; done |
xargs -0 python myscript.py
...或者,更便携(在MacOS上运行,虽然仍然需要shell - 例如bash - 可以处理NUL分隔的读取):
<div id="newprofileimg_<xsl:value-of select+"position()"/></div>
<script>
var width=screen.width;
var d=document.getElementById("newprofileimg_<xsl:value-of select="position()"/>");
d.style.backgroundImage="url(/services/resizeimage/<xsl:value-of select="./mediaid"/>/"+width+"/500);";
</script>
答案 1 :(得分:0)
您的标题似乎暗示您可以修改脚本。在这种情况下,使用nargs
(args数)选项为-f
标志允许更多参数:
parser = argparse.ArgumentParser()
parser.add_argument('--files', '-f', nargs='+')
args = parser.parse_args()
print(args.files)
然后您可以轻松使用find命令:
15:44 $ find . -depth 1 | xargs python args.py -f
['./args.py', './for_clint', './install.sh', './sys_user.json']
否则,如果您无法修改脚本,请参阅@ CharlesDuffy的答案。