我似乎无法修复文件名问题中的空间问题,如通常推荐的那样,在这种情况下使用 -print0 用于 gnu-find 和 -0 用于 gnu-parallel 和 gnu-xargs 之类的开关。
我成功地将 find、parallel in pipe mode 和 xargs 结合起来,在“块”中为 100k+ 个文件并行运行命令。我在下面的示例中使用了 echo 和 ls,但我打算使用我自己的 python 命令。请注意,由于启动程序的开销,我想在多个文件上运行每个命令实例,因此在 --pipe 模式和 --block 等中使用并行。命令
find ./dirNames/ -type f | parallel --pipe --block 100 -j4 --round-robin "echo \"Start *****\"; cat ; echo \"Done *****\""
结果是
Start *****
./dirNames/bbbbbbbbbbbbbbbb
./dirNames/dddddddddddddddddddd
./dirNames/aaaaaaaaaaaaaaaa
Done *****
Start *****
./dirNames/cccccccc cccccccc
./dirNames/eeeeeeeeeeeeeeeeeeee
Done *****
如预期的。gnu-echo 运行两次,在一个实例中运行 3 个文件,在另一个实例中运行 2 个文件。如果我用 xargs 和 ls 尝试这个,我会在文件名问题中遇到经典空间......
find dirNames/ -type f | parallel --pipe --block 40 -j4 --round-robin "echo \"Start *****\"; xargs ls -l ; echo \"Done *****\""
导致这
Start *****
-rw-rw-r-- 1 robert robert 0 Jun 24 10:10 dirNames/bbbbbbbbbbbbbbbb
-rw-rw-r-- 1 robert robert 0 Jun 25 16:11 dirNames/eeeeeeeeeeeeeeeeeeee
Done *****
Start *****
-rw-rw-r-- 1 robert robert 0 Jun 24 10:10 dirNames/aaaaaaaaaaaaaaaa
Done *****
Start *****
-rw-rw-r-- 1 robert robert 0 Jun 25 16:11 dirNames/dddddddddddddddddddd
Done *****
Start *****
Done *****
ls: cannot access 'dirNames/cccccccc': No such file or directory
ls: cannot access 'cccccccc': No such file or directory
在这种情况下,我似乎无法修复使用 -print0 等开关进行查找,使用 -0 进行并行和 xargs 等开关,通常建议用于此问题。并行似乎被 find 与 -print0 的输出混淆了。请告知,因为我真的没有想法了:(