rsync include excite 非常慢

rsync include excite 非常慢

当我用来rsync复制与模式匹配的文件时https://unix.stackexchange.com/a/2503/288916这可行,但速度非常慢。find更快地找到匹配的文件。 (好像快了 10 倍以上。)这正常吗?对此可以采取什么措施吗?

似乎更好的策略是只使用 find 并仅一一复制匹配的结果(使用scprsync)。


示例命令(另请参阅链接的问题以了解该命令的用途):

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

答案1

当您进行比较时findrsync请记住,您并不是真正进行同类比较:

  • find仅扫描源文件树,
  • rsync不仅扫描源文件树,而且还与相应的目标文件(大小、日期时间、权限、所有权)进行元数据比较,以查看是否需要将源文件复制到目标文件。

我对 GPFS 不熟悉,但它似乎是一个集群文件系统,这意味着您的文件访问也可能受到网络限制。然而,在第一次运行文件系统之后,基于 Linux 的系统将尽力缓存文件树,以便后续访问基于内存。仅通过这一优化,我就将包含 140000 个文件的树的速度提高了 30 倍。

为了进行比较,您可以考虑以下代码更接近rsync您的问题中显示的实现。我发现find即使在考虑mkdir和之前,它也比相应的原始数据慢大约 200 倍cp(在它们前面加上 no-op 前缀:以防止它们的操作)。

cd ~/LaTeX &&
    find . -type f -name '*.pdf' |
        while IFS= read -r src
        do
            dst=~/Output/"$src"
            if [ ! -f "$dst" ] || [ "$(stat -c '%s-%Y' -- "$src")" != "$(stat -c '%s-%Y' -- "$dst")" ]
            then
                mkdir -p -- "${dst%/*}"
                cp -p -- "$src" "$dst"
            fi
        done

它绝对没有那么聪明,rsync但我相信这是一个公平的起点。

rsync最后,如果您想使用以下命令驱动文件选择,find也可以这样做:

cd ~/LaTeX &&
    find . -type f -name '*.pdf' -print0 |
        rsync -av --files-from - --from0 ./ ~/Output/

如果没有,请将find … -print0其替换-print并删除--from0。您可能会遇到边缘大小写文件名(包含换行符和其他不常见字符的文件名)的问题,但对于大多数文件名,它将继续正常工作。

相关内容