为了做好准备,下面是一个示例文件结构:
test/1
test/2
test/3
我想做这个:
find -P -O3 "test/" -type f |
parallel --use-cpus-instead-of-cores -j+0 --tmpdir "test/" --files ./test.bash
并传递另一个手动参数,test.bash
如果是:
#!/usr/bin/env bash
main() {
echo "yay $1 $2!"
}
main "$1" "$2"
的输出cat test/*.par
是:
yay test/1 param!
yay test/2 param!
yay test/3 param!
我尝试过以下方法:
parallel --use-cpus-instead-of-cores -j+0 --tmpdir "test/" --files ./test.bash ::: 'param'
parallel --use-cpus-instead-of-cores -j+0 --tmpdir "test/" --files ./test.bash {} ::: 'param'
但它们都失败了,并且优先考虑手动参数而不是管道输入。
有办法执行此操作吗?
答案1
这有点不安全,因为文件名可以包含分隔符(换行符):
find -P -O3 test/ -type f \
| parallel -j+0 --use-cpus-instead-of-cores \
--tmpdir test/ \
--files \
-m ./test.bash {} 'param'
使用:
find -P -O3 test/ -type f --print0 \
| parallel -0 \
-j+0 --use-cpus-instead-of-cores \
--tmpdir test/ \
--files \
-m ./test.bash {} 'param'
find
通过 0 字节来生成单独的结果(这可以不是出现在文件名中),并使用parallel
它们。
然而,为什么要使用find
呢?使用zsh
, 代替bash
,
setopt extendedglob # usually already be on by default
setopt nullglob # don't fail if no files found
parallel -j+0 --use-cpus-instead-of-cores \
--tmpdir test/ \
--files \
-m ./test.bash {} 'param' \
::: test/**/*(.)
### ^^------- look recursively into all folders including the current
### (doesn't follow symlinks!)
### ^----- for anything
### ^^^-- as long as it's a file
答案2
终于找到了参考!
find -P -O3 test/ -type f \
| parallel -j+0 --use-cpus-instead-of-cores \
--tmpdir test/ \
--files \
-m ./test.bash {} 'param'