当前位置: 首页>>操作系统>>正文


快速ls命令

Georgia 操作系统 , , , 去评论

问题描述

我必须得到一个包含大约2百万个文件的目录列表,但是当我做了一个ls命令时,它没有任何回报。我等了3个小时我试过ls | tee directory.txt,但这似乎永远都挂了。

我假设服务器正在做很多inode排序。有没有办法加快ls命令,以获取目录列表的文件名?我现在不在乎大小,日期,权限等。

最佳解决方法

ls -U

会做ls没有排序。

次佳解决方法

尝试使用:

find . -type f -maxdepth 1

这将仅列出目录中的文件,如果要列出文件和目录,请不要使用-type f参数。

第三种解决方法

这可能不是一个有用的答案,但如果您没有find,您可以使用tar

$ tar cvf /dev/null .

比我大的人告诉我,“回到当天”,single-user和恢复环境比现在更受限制。这就是这个招数来自哪里。

第四种方法

运用

ls -1 -f 

是快10倍,很容易做(我测试了100万个文件,但我原来的问题有6 800 000 000个文件)

但在我的情况下,我需要检查一些特定的目录是否包含超过10 000个文件。如果有超过10 000个文件,我不再感兴趣的文件有多少。我只是退出程序,以便它会运行得更快,不会尝试阅读其余的one-by-one。如果少于10 000,我将打印确切的金额。如果您为参数指定的值大于文件数量,我的程序速度与ls -1 -f非常相似。

您可以使用我的程序find_if_more.pl在当前目录中键入:

find_if_more.pl 999999999

如果您只是有超过n个文件感兴趣,脚本将比ls -1 -f更快,文件数量非常多。

#!/usr/bin/perl
    use warnings;
    my ($maxcount) = @ARGV;
    my $dir = '.';
    $filecount = 0;
    if (not defined $maxcount) {
      die "Need maxcount\n";
    }
    opendir(DIR, $dir) or die $!;
    while (my $file = readdir(DIR)) {
        $filecount = $filecount + 1;
        last if $filecount> $maxcount
    }
    print $filecount;
    closedir(DIR);
    exit 0;

第五种方法

您可以重定向输出并在后台运行ls进程。

ls > myls.txt &

这将允许您在运行时继续关于您的业务。它不会锁定你的shell。

不知道运行ls和获取较少数据的选项是什么。您可以随时运行man ls进行检查。

第六种方法

这个问题似乎很有趣,我正在经历多次发布的答案。要了解发布的答案的效率,我已经执行了200万个文件,结果如下。

$ time tar cvf /dev/null . &> /tmp/file-count

real    37m16.553s
user    0m11.525s
sys     0m41.291s

------------------------------------------------------

$ time echo ./* &> /tmp/file-count

real    0m50.808s
user    0m49.291s
sys     0m1.404s

------------------------------------------------------

$ time ls &> /tmp/file-count

real    0m42.167s
user    0m40.323s
sys     0m1.648s

------------------------------------------------------

$ time find . &> /tmp/file-count

real    0m2.738s
user    0m1.044s
sys     0m1.684s

------------------------------------------------------

$ time ls -U &> /tmp/file-count

real    0m2.494s
user    0m0.848s
sys     0m1.452s


------------------------------------------------------

$ time ls -f &> /tmp/file-count

real    0m2.313s
user    0m0.856s
sys     0m1.448s

------------------------------------------------------

总结结果

  1. ls -f命令运行速度比ls -U快一点。禁用颜色可能会导致此改进。

  2. find命令第三,平均速度为2.738秒。

  3. ls花了42.16秒。在我的系统中lsls --color=auto的别名

  4. echo ./*使用shell扩展功能运行了50.80秒。

  5. 而基于tar的解决方案大概需要37个小时。

当系统处于空闲状态时,所有的测试都是单独完成的。

这里要注意的一个重要事情是,文件列表不会打印在终端中,而是被重定向到一个文件,文件计数稍后用wc命令计算。如果在屏幕上打印的输出,命令运行得太慢。

任何想法为什么会这样?

第七种方法

我有一个目录,其中有400万个文件,我唯一的方法是我立即吐出文件,没有很多的搅拌首先是

ls -1U

第八种方法

我假设你使用的是GNU ls?尝试

\ls

它将unalias通常的ls(ls – color = auto)。

第九种方法

如果一个进程“不回来”,我建议strace来分析流程如何与操作系统进行交互。

在ls的情况下:

$strace ls

您会看到它在实际输出任何内容之前读取所有目录条目(getdents(2))。 (排序…因为这里已经提到)

参考文献

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

本文由《共享笔记》整理, 博文地址: https://gxnotes.com/article/151972.html,未经允许,请勿转载。
Go