Bash:如何有效地计算远程 NFS 驱动器上子文件夹中的文件数量?

Bash:如何有效地计算远程 NFS 驱动器上子文件夹中的文件数量?

我正在尝试批量执行一个操作,该操作计数远程 NFS 驱动器的给定子文件夹中的文件数量。

NFS 客户端是 Ubuntu 16.04 LTS。我对远程 NFS 服务器的信息很少。它是 NFS v3。它是匿名 rw 安装的,其身份验证基于 IP。客户端的带宽为 100/10,上传速度约为 1.1 MB/s。提供商宣传其备份存储保证 1Gbit/1Gbit。卷的可用大小为 <4TB,预计文件数量估计为 >600000 个单位。

--编辑#1

该存储宣传的保证 IOPs 为 2000,但测试远程 fs 的结果为 7-800iops。

客户端使用的挂载选项按照提供商的建议:

rsize=8192,wsize=8192,timeo=14,intr

为了执行计数,我选择了这个脚本:

#!/bin/bash
if [[ $# -eq 0 ]] ; then
   echo 'no folder supplied, use $0 /path/to/folder'
   exit 0
else
   COUNT=$(find $1 -type f|wc -l)
   echo $1 contains $COUNT files.
fi
exit 0

我在家里试了一下,明显很快,输出:

/home/user contains 12 files.

当我尝试从远程 NFS 驱动器获取此类统计数据时,脚本会“永远”停止运行。

--编辑#2:

我尝试删除并在末尾|wc -l添加,但它似乎会在 2 到 24 小时的时间范围内随机挂起,并且当它在很长时间后挂起时,列表远未完整。>> $LOGFILEfind

我认为我可以将查找分成几块,为了防止出现此问题,也许可以生成所有子文件夹的列表......

for d in $FOLDERLIST;
do
   find $d -maxdepth 0 -type f|wc -l >> $TMPLOG
done

..然后将$TMPLOG 中的所有数字相加,这样在较小的操作中脚本可能不会挂起。

问题:我是否使用了最节省资源的方式来执行此计数?也许有比find获取文件计数更便宜的方法?

我认为计数文件的方法可能不对,因为我看到在远程驱动器上花费的时间应该相当长...我记得我曾经有过通过 curlftpfs 安装远程文件系统的经验。巨大的开销,巨大的延迟。

NFS 在这方面应该做得更好,但在这种情况下似乎并非如此!

答案1

您可以尝试rsync使用类似如下的方法:

rsync --stats -na <srcdir> /tmp/fakedir

输出的前两行将如下所示:

Number of files: 2000
Number of files transferred: 1900

第一个值是目录+文件条目的总和,而第二个仅显示文件数量

相关内容