如何在一次查找运行中分别计算文件、目录、符号链接和硬链接的数量?

如何在一次查找运行中分别计算文件、目录、符号链接和硬链接的数量?

为了检查迁移是否成功,我使用find计数来计算文件、目录、符号链接和具有多个硬链接的文件的数量。由于要检查的目录包含大量文件,因此每次find运行都需要几个小时。因此,我寻找一种方法来在一次运行中分别计算文件、目录、符号链接和具有多个硬链接的文件的数量find

以下是我目前的做法

num_files=$(find $directory -type f | wc -l)
num_directories=$(find $directory -type d | wc -l)
num_symlinks=$(find $directory -type l | wc -l)
num_hardlinks=$(find $directory -type f -links +1 | wc -l)

我怎样才能在一次find运行中获得这四个计数器?

答案1

下面应该可以做到。它需要 GNU find;在 OS X 上,例如findutil使用 Homebrew 安装。

find $directory -type d -printf d -o -type l -printf l -o -type f -links +1 -printf h -o -type f -printf f

这将为每个遇到的文件系统条目打印一个字符:

  • d如果它是一个文件
  • l如果是符号链接
  • h如果是带有硬链接的文件
  • f如果它是一个文件(如果不是h

输出如下所示(我的系统上的实际摘录):

dfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdffffffffddfdffdfffffffffddfdldfllfdlldffffdfllfdlllllldffffdffffldfllfddffdldfddddffffflllldllllldlffffldfllfdlldffffdfllfddffddfddddfffffldfddddfffffdfddddfffffdlllldffffldfffflflllldffflfdffflfdfllfddffffldffffdfffflldfffflllldffffdffffdfffflldfllfddffdldfddddfffffdllllddflfffflldfllfddffffdffffdffffldffffdffffdffffdffffllldffffldffffdffffldffffldffffdffffdffffllllllldffffldffffdfffflllllldfffflldffddldfllfdldfffflldfffflldffffdfffflldffffdffffdfllfdlldfffflllldfllfdlldffffdfllfdlllllldffffdffdldfllfdlldfffflldfffflldffffldffffldfffflldfllfdldffffldffffldffdldffdddffddffddffddldfllfdlldffffdffffdfffflldfffflldffffdffffllldffffdffffdfllfddffffldfffflllldffffldfffflllldffffdfllfddffdldddddfffdddddfffdddddfffdddddfffdldlfffflldlffffllldfffllldffffdlffffdlffffldfffflldffdldfllfdllldffffdffffdffffldfllfdlllldfffflldfllfdldfddffffffl

将输出重定向到文件,然后它变成简单的字符串处理以便稍后计算。

答案2

find $directory -type d -exec echo dirs \; -o -type l -exec echo symlinks \; -o -type f -links +1 -exec echo hardlinks \; -o -type f -exec echo files \; | sort | uniq -c

产生如下输出:

 326 dirs
2164 files
  40 hardlinks
 164 symlinks

答案3

使用回答丹尼尔·贝克我开发了以下解决方案,它适用于大多数版本find并且还提供了计数魔法:

output=$(find $directory -type d -exec printf d \; -o -type l -exec printf l \; -o -type f -links +1 -exec printf h \; -o -type f -exec printf f \;)
num_files=$(echo $output | grep -o "f" | wc -l)
num_directories=$(echo $output | grep -o "d" | wc -l)
num_symlinks=$(echo $output | grep -o "l" | wc -l)
num_hardlinks=$(echo $output | grep -o "h" | wc -l)

相关内容