快速ls命令
我必须得到一个包含大约200万个文件的目录列表,但是当我对它执行ls
命令时,什么也没回来。我已经等了三个小时了。我试过ls | tee directory.txt
,但这似乎永远挂起。
我假设服务器正在执行大量的inode排序。有什么方法可以加快ls
命令来获取文件名的目录列表吗?我目前不在乎大小,日期,权限等。
解决方案
回答
find ./ -type f(它将在当前目录中找到所有文件)怎么样?脱开" -f型"以查找所有内容。
回答
尝试使用:
find . -type f -maxdepth 1
这只会列出目录中的文件,如果要列出文件和目录,则省略-type f
参数。
回答
尝试的事情:
检查ls是否没有别名?
alias ls
也许尝试寻找代替吗?
find . \( -type d -name . -prune \) -o \( -type f -print \)
希望这可以帮助。
回答
我们可以重定向输出并在后台运行ls进程。
ls > myls.txt &
这样一来,我们就可以继续开展自己的业务。它不会锁定外壳。
不确定用于运行ls和获取较少数据的选项。我们总是可以运行man ls
进行检查。
回答
我假设我们正在使用GNU ls?
尝试
\ls
它将消除通常的ls(ls --color = auto)的别名。
回答
ls -U
将执行ls而不进行排序。
回答
我们正在使用哪种分区类型?
在一个目录中包含数百万个小文件,最好使用JFS或者ReiserFS,它们对于许多小文件具有更好的性能。
回答
我们应该提供有关所使用的操作系统和文件系统类型的信息。在某些类型的UNIX和某些文件系统上,我们可能可以使用命令ff和ncheck作为替代。
回答
如果进程"不回来",我建议使用strace来分析进程与操作系统的交互方式。
如果是ls:
$strace ls
我们会看到它在实际输出任何内容之前先读取所有目录条目(getdents(2))。 (如此处已提到的那样进行排序)
回答
这里还有许多其他好的解决方案,但出于完整性考虑:
echo *
回答
我们也可以使用xargs。只需通过xargs传递ls的输出。
ls | xargs
如果这不起作用,并且上面的find示例不起作用,请尝试将它们管道传输到xargs,因为它可以帮助解决可能导致问题的内存使用。
回答
一些后续行动:
我们无需提及正在运行的操作系统,这将有助于指示我们正在使用的ls版本。这可能不是ls问题那样的"重击"问题。我的猜测是我们正在使用GNU ls,它具有一些在某些情况下有用的功能,但会在大型目录上使我们丧命。
GNU ls试图对列进行更漂亮的安排。 GNU ls尝试对所有文件名进行智能排列。在巨大的目录中,这将需要一些时间和内存。
要"解决"此问题,我们可以尝试:
ls -1
完全没有列
在某处找到BSD ls,http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/并将其用于大型目录。
使用其他工具,例如查找
回答
这可能不是一个有用的答案,但是如果我们没有"查找"功能,则可以使用" tar"来解决。
$ tar cvf /dev/null .
比我年长的人告诉我,"回到过去",单用户和恢复环境比现在受到的限制要多得多。这就是这个窍门的来源。