我使用该bash命令搜索文件并在本地系统上执行md5dsum。我认为该命令在大型vendor
目录上的性能较差。是否有更好的样式而不是在性能更高的管道之后使用管道?
find ./vendor -type f -print0 | sort -z | xargs -0 md5sum | grep -vf /usr/local/bin/vchecker_ignore > MD5sums
答案 0 :(得分:7)
sort
在这里引入了阻塞:它必须等到find
完成后才能输出结果。大文件系统上的find
,尤其是使用hdd或nfs的文件系统,可能需要一段时间。
您可能想在最后进行排序,以使md5sum
与find
并行运行,例如:
find ./vendor -type f -print0 | xargs -0 md5sum | grep -vf /usr/local/bin/vchecker_ignore | sort -k2 > MD5sums
md5sum
对于大文件可能需要一些时间。如果有很多文件或文件很大,您可能希望使用GNU parallel
而不是xargs
来运行它。
您可能还喜欢使用行缓冲模式。在这种情况下,它需要对文件名使用换行分隔符(禁止在文件名中使用换行符号,这很不常见),而不是0分隔符才能使行缓冲模式起作用。例如:
stdbuf -oL find ./vendor -type f | stdbuf -oL grep -vf /usr/local/bin/vchecker_ignore | xargs -n50 -d'\n' md5sum | sort -k2 > MD5sums
以上命令将首先通过该grep
过滤每个文件,然后对50个文件的批次执行md5sum
。对于小文件,您可能需要较大的批次(并且可能会完全stdbuf -oL
都删除),对于大文件,则可能较小。