我有一个包含数十万个文件的目录。
我需要列出这些文件的示例(示例 10 个文件),而不处理目录中找到的所有文件,这将花费太多处理时间。
答案1
我认为您无法在不以某种方式读取所有文件的情况下从整个文件列表中进行采样,即使在文件系统级别也是如此。
除非它们的名称遵循一种模式(例如 fileXXXXXXX),在这种情况下,您可以在访问文件之前预先生成随机名称列表。对于如此大量的文件,如果它们的名称是随机的,那就很奇怪了。
但我们假设你没那么幸运。使用find
优于ls
,因为它可以使用 null 转义输出,从而使其不受文件名中非标准字符的影响。如果我们不想读取所有文件,那么使用列表开头的文件是最快的。为了获得更好的样本,我会首先使用更大的样本(如下),然后从那里$oversamplesize
随机选择大小。$samplesize
我没有成功地制作sort -R
或shuf
使用空分隔符,因此洗牌和最终选择是通过以下方式完成的awk
:
find ~ -type f -print0 |
grep --null --null-data -m ${oversamplesize:-100} . |
awk -v samplesize=${oversamplesize:-11} -vRS='\0' -vORS='\0' \
'{ a[NR]=$0 } END {srand(); while (i<samplesize) { b=(int(rand()*10000)%samplesize); if (b in c) {continue;} else {c[b]=a[b]; print a[b]; i++;} }; }' |
xargs -0 echo # echo here being just a dummy
这里有两个注释。由于某种原因,它通常还会打印空文件名,因此我增加了样本大小以防万一。重要的注意事项是不要忘记更改搜索路径(〜此处)和最终命令。