我需要寻找30GB-500GB之间的大文件。不幸的是,我需要在32位系统上执行此操作。
我刚刚用fseek()
撞到了PHP的2GB限制,这是我在网上看不到的。
$ php -r 'var_dump(fseek(fopen("/dev/sda", "r"), 0, SEEK_END));'
int(-1)
因此系统调用正在返回-1
。我想知道为什么:
$ strace php -r 'var_dump(fseek(fopen("/dev/sda", "r"), 0, SEEK_END));'
...
lstat64("/dev/sda", {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 0), ...}) = 0
lstat64("/dev", {st_mode=S_IFDIR|0755, st_size=5460, ...}) = 0
open("/dev/sda", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 0), ...}) = 0
lseek(3, 0, SEEK_CUR) = 0
lseek(3, 0, SEEK_END) = -1 EOVERFLOW (Value too large for defined data type)
这发生在一个只有60GB大小的文件上。
所以我甚至无法寻求结束 - lseek()
显然无法将文件指针表示回PHP。
另一方面,反复向前寻找SEEK_CUR似乎陷入4GB - 我无法移动文件指针超过该点。我需要寻找500GB文件的结尾。
我有什么选择?我目前的计划是使用dd
(这是在Linux上),而我正在编写的工具也可能是一个shell脚本......