列出当前目录及所有子目录中超过特定大小的文件

48

如何在当前目录及其子目录中显示所有大于10k字节的文件。

尝试过ls -size +10k但是没有起作用。


请问您能否详细阐述一下这个问题,或者至少解释一下为什么已经发表并且可行的两种解决方案不适合您的作业。(编辑:已添加“请”字) - matchew
1
ls 没有任何过滤输出按大小的选项。它确实有一个 --size 选项(没有参数),可以打印每个文件的块大小。顺便说一句,-size +10k 看起来像是与 find 一起使用的语法。 - doubleDown
Stack Overflow是一个面向编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参考帮助中心中的“我可以在这里问什么话题”部分。也许超级用户Unix&Linux Stack Exchange会更适合您提问。此外,请参阅[我应该在哪里发布有关Dev Ops的问题?] (http://meta.stackexchange.com/q/134306) - jww
如何查找文件大小大于/小于x字节的文件?在超级用户上。 - jww
5个回答

80

find . -size +10k -exec ls -lh {} \+

这段代码的第一部分与@sputnicks的回答完全相同,成功地找到目录中所有大小超过10k的文件(不要混淆k和K)。我的补充是,第二部分然后执行ls -lh或列出(-l)文件按人类可读大小(-h),如果您喜欢,可以取消-h。当然,{}是文件本身,而\+只是\;的另一种替代方式。

在实践中,\;会重复执行:

ls -l found.file; ls -l found.file.2; ls -l found.file.3

\+将其显示为一个语句:

ls -l found.file found.file.2 found.file.3

有关find中的 \; vs +更多内容。

此外,您可能希望按大小排序。这相对容易实现。我将-s选项添加到ls中,因此ls -ls,然后将其导出到sort -n进行数字排序。

它变成:

find . -size +10k -exec ls -ls {} \+ | sort -n

或者以相反的顺序添加-r:

find . -size +10k -exec ls -ls {} \+ | sort -nr

最后,您的标题说在目录中找到最大文件。您可以通过将代码传输给tail来实现。

find . -size +10k -exec ls -ls {} \+ | sort -n | tail -1 将为您查找目录及其子目录中最大的文件。

注意,您还可以使用-S按大小对文件进行排序,而无需使用sort。但要查找最大的文件,您需要使用head命令。

find . -size +10k -exec ls -lS {} \+ | head -1

使用-S而不是sort的好处有两点:一是您不必键入sort -n;二是您还可以使用人类可读大小选项-h。这是我最喜欢使用的选项之一,但在旧版本的ls中不可用,例如我们工作中有一个没有-h的旧CentOs 4服务器。


我在一个没有子目录的目录上尝试了这个,它完美地运行了。让我在另一个目录上试试。顺便说一下,“find”是你要找的。 - matchew
好的,我在另一个目录上尝试了一下。这就是你想要的。你能解释一下为什么这绝对不是那个吗? - matchew
这是因为在这个任务中我们需要输入一个命令。如果命令正确,我就会被带到任务的下一部分。 - eveo
3
实际上这个答案是正确的。我忘记了我们在课程中涵盖了find命令,所以可以使用它。答案是“find . -size +10k”。非常感谢您提供详细的答案,我非常非常感激。 - eveo
@matchew 嗯,不要升级到 4.7.0-git,因为它无法正常工作。在 4.7.0 上,我看到了目录、大小为 0 字节的文件、符号链接以及明显小于 10k 的文件。 - Ereli
显示剩余7条评论

16

试试做这个:

find . -size +10k -ls

如果您想使用二进制ls

find . -size +10k -exec ls -l {} \;

我想用ls而不是find来显示它们。ls -l . -size +10k没有起作用。 - eveo
还是不行,这是一个作业。"您当前的目录是 dir。显示所有在 dir(和其子目录)中大于10k字节的文件。" - eveo
1
我不明白你的意思。我提议的正是你所要求的。 - Gilles Quénot
我同意,Sputnick,他可能在追求什么。+1 给你,因为我的答案是你的修改版。我以前从未使用过 find 带有 -ls 选项,不过我经常使用 find 带有 size 或 mtime。 - matchew
OP已经明确表示这是一项作业,并且作业的一部分是使用ls命令。 - frankc
1
在我的帖子中添加了ls二进制版本。 - Gilles Quénot

9
我意识到这项任务很可能已经过去了。对于其他人:
你正在过度复杂化。
find . -size +10k

4
我会补充一下@matchew的答案(没有足够的Karma点来评论):
find . -size +10k -type f -maxdepth 1 -exec ls -lh {} \; > myLogFile.txt

-type f:指定常规文件类型

-maxdepth 1:确保它只在当前目录中查找文件。


1
(顺便说一句,我们称之为“声望”,而不是“业力”。这不是Reddit) - Dennis Meng

3
你可以这样使用 ls 命令:
ls -lR | egrep -v '^d' | awk '$5>10240{print}'

解释:

ls -lR         # list recursivly
egrep -v '^d'  # only print lines which do not start with a 'd'. (files)

只打印第五列(大小)大于10240字节的行:

awk '$5>10240{print}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接