当我用来rsync
复制与模式匹配的文件时https://unix.stackexchange.com/a/2503/288916这可行,但速度非常慢。find
更快地找到匹配的文件。 (好像快了 10 倍以上。)这正常吗?对此可以采取什么措施吗?
似乎更好的策略是只使用 find 并仅一一复制匹配的结果(使用scp
或rsync
)。
示例命令(另请参阅链接的问题以了解该命令的用途):
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
答案1
当您进行比较时find
,rsync
请记住,您并不是真正进行同类比较:
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
。您可能会遇到边缘大小写文件名(包含换行符和其他不常见字符的文件名)的问题,但对于大多数文件名,它将继续正常工作。