微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 --pipe 模式下重击“gnu-find”+“gnu-parallel”并使用名称中包含空格的某些文件执行 cmds

如何解决在 --pipe 模式下重击“gnu-find”+“gnu-parallel”并使用名称中包含空格的某些文件执行 cmds

在这种情况下,我似乎无法像通常推荐的那样使用 -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,这通常是针对此问题的建议。 parallel 似乎被 find 和 -print0 的输出混淆了。请提供建议,因为我真的没有想法了:(

解决方法

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

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

$ find -type f -print0 | parallel --keep-order --no-run-if-empty --pipe --blocksize 15 --recstart '\0' --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 的错误消息关于无法在空文件名上列出文件属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。