快速命令

Mar*_*zak 36 unix bash command ls

我必须得到一个包含大约200万个文件的目录列表,但是当我ls对它执行命令时,什么都没有回来.我等了3个小时.我试过了ls | tee directory.txt,但这似乎永远挂了.

我假设服务器正在进行大量的inode排序.有没有办法加快ls命令只是获取文件名的目录列表?我此时并不关心大小,日期,许可等.

Pau*_*lin 39

ls -U
Run Code Online (Sandbox Code Playgroud)

会做没有排序的ls.

  • 注意:在某些系统上,`ls -f`相当于`ls -aU`; 即,包括_all_文件(即使名称以'.'开头的文件)也不要排序.在_some_系统上,`-f`是***选项来抑制排序,`-U`做其他事情(或什么都不做). (3认同)

Rya*_*arn 11

尝试使用:

find . -type f -maxdepth 1
Run Code Online (Sandbox Code Playgroud)

这将只列出目录中的文件,-type f如果要列出文件和目录,请省略参数.


Kan*_*han 8

这个问题似乎很有趣,我正在经历多个已发布的答案.为了理解发布的答案的效率,我已经在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

------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

总结结果

  1. ls -f命令运行速度比ls -U.禁用颜色可能会导致这种改进.
  2. find 命令运行第三,平均速度为2.738秒.
  3. 跑步只ls花了42.16秒.在我的系统中ls是别名ls --color=auto
  4. 使用shell扩展功能echo ./*运行50.80秒.
  5. tar基础的解决方案用了大约37 miuntes.

当系统处于怠速状态时,所有测试都是单独进行的.

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

任何想法为什么会这样?


stu*_*stu 7

我有一个包含400万个文件的目录,而我得到ls立即吐出文件而没有太多麻烦的唯一方法是

ls -1U
Run Code Online (Sandbox Code Playgroud)

  • 拯救了我的一天!谢谢! (2认同)

小智 6

这将是最快的选项 AFAIK: ls -1 -f

  • -1 (无列)
  • -f (无排序)


小智 6

使用

ls -1 -f 
Run Code Online (Sandbox Code Playgroud)

速度大约快10倍,而且操作简单(我测试了100万个文件,但最初的问题有6 800000000个文件)

但就我而言,我需要检查某个特定目录是否包含超过10 000个文件。如果有超过10 000个文件,那么我不再对有多少文件感兴趣。我只是退出程序,以便它运行更快,并且不会尝试一一阅读其余的程序。如果少于一万,我将打印准确的金额。如果您为参数指定的值大于文件数量,则我的程序的速度与ls -1 -f非常相似。

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

find_if_more.pl 999999999
Run Code Online (Sandbox Code Playgroud)

如果您只是想知道文件数是否大于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;
Run Code Online (Sandbox Code Playgroud)


小智 5

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

ls > myls.txt &
Run Code Online (Sandbox Code Playgroud)

这将允许您在业务运行时继续开展业务。它不会锁住你的外壳。

不确定运行 ls 和获取较少数据的选项是什么。你可以随时跑去man ls检查。


Mar*_*iek 1

怎么样find ./ -type f(它将找到当前目录中的所有文件)?脱掉就能-type f找到一切。