为了检查迁移是否成功,我使用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)