普通当我想显示目录中第一个文件的名称时,我键入:
ls raw/all | head -n 1
但是在目录中有很多文件时需要很长时间
例如,对于具有接近 900 k 文件的目录,我们有以下测量结果:
time ls raw/all | head -n 1
real 0m17.250s | 0m10.328s | 0m6.334s
user 0m3.224s | 0m3.884s | 0m3.192s
sys 0m0.544s | 0m0.664s | 0m0.572s
while 循环遍历所有文件需要:
time ls raw/all | wc -l
real 0m6.455s | 0m5.869s | 0m5.228s
user 0m3.612s | 0m3.468s | 0m4.072s
sys 0m0.460s | 0m0.784s | 0m0.624s
如何以有效的方式打印第一个文件的名称?
这很棘手。两种方法:
方法1;
find
:find
and-print
s 找到的第一个文件,并且-quit
s 立即。-mindepth 1
将阻止匹配.
当前目录的硬链接。如果您只对常规文件感兴趣,请添加
-type f
:-mindepth 1
然后可以删除,因为.
目录将不匹配。方法2;
sh
,stdbuf
, 和awk
:请注意,这可能会
ARG_MAX
因文件过多而被触发(参数列表变得太长,超过ARG_MAX
字节)。在这种情况下,请使用方法 1。printf
,echo
)来打印文件名*
, 进行扩展(排序规则应该与ls
给定locale
的 's相同LC_COLLATE
)stdbuf -o0
(stdbuf
GNU 自带coreutils
)使printf
/echo
无缓冲的 STDOUT 流|
条记录之后的STDOUTprintf
echo
awk
exit
awk
退出后,stdbuf
(printf
) 将收到SIGPIPE
,并将被杀死printf
ASCII NUL (\0
) 分隔文件名,并\0
用作记录分隔符awk
来解决与文件名相关的任何边缘情况把这些放在一起: