Bash "gnu-find" + "gnu-parallel" 在 --pipe 模式下执行 cmds 并执行某些文件名中包含空格的文件



在这种情况下,我似乎无法使用诸如-print0(用于gnu-find(和-0(用于gnu parallel(之类的开关来解决文件名中的空间问题,通常建议使用gnu-xargs。

我成功地将find、parallel in pipe模式和xargs组合在一起,在";块";10万个以上的文件。我在下面的例子中使用了echo和ls,但我计划使用自己的python命令。注意,由于启动程序的开销,我希望在多个文件上运行每个命令实例,因此使用了并行管道模式和块等。命令

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表示find和-0表示parallel和xargs等开关的问题,这通常是解决这个问题的建议。parallel似乎被带有-print0的find的输出弄糊涂了。请告知,因为我真的没有想法了:(

这是我发布到GNU并行邮件列表的答案。

我认为您需要使用--recstart '',而不是并行使用--null。当您在命令行中使用文件名运行python脚本时,我认为您会遇到问题——我在这里使用了ls来演示一种可能的解决方案。

$ find -type f -print0 | parallel --keep-order --no-run-if-empty --pipe --blocksize 15 --recstart '' --roundrobin 
"echo start {#}; xargs -0r ls -Q 2>&- | xargs -rt ls --fu; echo end {#}"
start 1
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:39:02.916427000 -0700 ./a
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:40:33.076957000 -0700 ./g
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:40:33.096995000 -0700 ./i
end 1
ls --fu ./a ./g ./i 
start 2
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:39:02.916552000 -0700 ./b c
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:40:33.076553000 -0700 ./f
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:40:33.077123000 -0700 ./h
end 2
ls --fu './b c' ./f ./h 
start 3
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:39:02.916633000 -0700 ./d
-rw-r--r-- 1 larry wheel 0 2021-06-27 12:40:33.076273000 -0700 ./e
end 3
ls --fu ./d ./e 

请注意,在第一个ls上禁止stderr-如果没有它,ls会发出错误消息,说明无法在空文件名上列出文件属性。

最新更新