快速ls命令

时间:2020-03-05 18:46:38  来源:igfitidea点击:

我必须得到一个包含大约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 .

比我年长的人告诉我,"回到过去",单用户和恢复环境比现在受到的限制要多得多。这就是这个窍门的来源。