我不知道 gnu gawk 的 filefuncs 扩展的可移植性如何。基本语法是
$ time gawk -e '@load "filefuncs"; BEGIN {
fnL[1] = ARGV[ARGC-1];
fts(fnL, FTS_PHYSICAL, arr); print "";
for (fn0 in arr) {
print arr[fn0]["path"] \
" :: "arr[fn0]["stat"]["size"]; };
print ""; }' genieMV_204583_1.mp4
genieMV_204583_1.mp4 :: 259105690
real 0m0.013s
$ ls -Aln genieMV_204583_1.mp4
---------- 1 501 20 259105690 Jan 25 09:31
genieMV_204583_1.mp4
该语法允许一次检查多个文件。对于单个文件,它是
$ time gawk -e '@load "filefuncs"; BEGIN {
stat(ARGV[ARGC-1], arr);
printf("\n%s :: %s\n", arr["name"], \
arr["size"]); }' genieMV_204583_1.mp4
genieMV_204583_1.mp4 :: 259105690
real 0m0.013s
几乎没有任何增量节省。但诚然比 stat 略慢
$ time stat -f '%z' genieMV_204583_1.mp4
259105690
real 0m0.006s (BSD-stat)
$ time gstat -c '%s' genieMV_204583_1.mp4
259105690
real 0m0.009s (GNU-stat)
最后,一种将每个字节读入 awk 数组的简洁方法。此方法适用于二进制文件(正面或背面没有差异):
$ time mawk2 'BEGIN { RS = FS = "^$";
FILENAME = ARGV[ARGC-1]; getline;
print "\n" FILENAME " :: "length"\n"; }' genieMV_204583_1.mp4
genieMV_204583_1.mp4 :: 259105690
real 0m0.270s
$ time mawk2 'BEGIN { RS = FS = "^$";
} END { print "\n" FILENAME " :: " \
length "\n"; }' genieMV_204583_1.mp4
genieMV_204583_1.mp4 :: 259105690
real 0m0.269
但这不是最快的方法,因为您将其全部存储在 RAM 中。正常的 awk 范式在线条上运行。问题是对于像 mp4 这样的二进制文件,如果它们不完全以 \n 结束,则 length + NR 方法的总和将多计一。下面的代码是一种通过明确使用最后一个 1 或 2 字节作为分行符 RS 的包罗万象的形式。
我发现使用2-byte 方法处理二进制文件 的速度要快得多,而1-byte 方法是一个以换行符结尾的典型文本文件。对于二进制文件,1 字节的 1 字节可能会过于频繁地进行行拆分并减慢速度。
但我们在这里已经接近于吹毛求疵了,因为 mawk2 读取 1.83GB txt 文件的每个字节都是 0.95 secs,所以除非你正在处理大量数量,可以忽略不计。
尽管如此,stat 仍然是迄今为止最快的,正如其他人所提到的,因为它是一个 OS 文件系统调用。
$ time mawk2 'BEGIN { FS = "^$";
FILENAME = ARGV[ARGC-1];
cmd = "tail -c 2 \""FILENAME"\"";
cmd | getline XRS;
close(cmd);
RS = ( length(XRS) == 1 ) ? ORS : XRS ;
} { bytes += length } END {
print FILENAME " :: " bytes + NR * length(RS) }' genieMV_204583_1.mp4
genieMV_204583_1.mp4 :: 259105690
real 0m0.092s
m23lyricsRTM_dict_15.txt :: 1961512986
real 0m0.950s
$ ls -AlnFT "${m3t}" genieMV_204583_1.mp4
-rw-r--r-- 1 501 20 1961512986 Mar 12 07:24:11 2021 m23lyricsRTM_dict_15.txt
-r--r--r--@ 1 501 20 259105690 Jan 25 09:31:43 2021 genieMV_204583_1.mp4
(mp4更新cuz awk方法的文件权限需要它)