如何使用find命令只打印名称和文件大小?

问题描述 投票:0回答:5

所以我有这个可以使用的命令行。

find . -type f |xargs ls -lS |head -20

问题是我只想输出文件大小和名称。我试过:

find . -type f -printf '%s %p\n' |xargs ls -lS |head -20

但这给了我一堆“无法访问[inode],没有这样的文件或目录”错误。

我的目标是打印目录中最大的 20 个文件,而不是使用 ls。

linux bash command-line find printf
5个回答
4
投票

不涉及

ls
的答案:

find . -type f -printf '%k %p\n' |sort -n |tail -n 20

这将为每个文件列出大小(以 kB 为单位)、一个空格,然后是按数字排序的文件名,然后您将获得最后 20 个项目(最大的 20 个)。

您的问题在于管道到

ls

如果你有一个真正大的目录结构,

sort
将会崩溃。如果您已经知道大致大小并且大多数文件要小得多,您可以告诉
find
使用附加选项排除较小的大小,例如
find . -type f -size +2M -printf …
删除 2MiB 以下的任何内容。否则,您必须使用一些仅存储最大 20 个项目的自定义代码。


2
投票

使用以下命令获取 Linux 中 fiule 的大小。

du -h <<FileName>>

或者

du -h <<FilePath>>

2
投票

在问题中,您说:

我的目标是打印目录中最大的 20 个文件,而不是使用 ls。

这意味着可接受的解决方案不应该使用

ls

另一个问题是

xargs
的使用。像
find . -type f | xargs ls
这样的结构不适用于包含空格的子目录或文件名,因为它会先将字符串从
find
中拆分出来,然后再将其交给
ls
。您可以保护字符串或使用以 null 结尾的字符串(例如
find . -type f -print0 | xargs -0 ls
)解决此问题。一般来说,使用xargs
安全考虑
。与其验证您的
xargs
构造是否安全,不如完全避免使用它(特别是当您不需要它时)。

尝试打印不带

ls
和不带
xargs
的 20 个最大文件:

    find . -type f -printf '%s %p\n' | sort -rn | head -20

0
投票

find . -type f |xargs ls -lS |head -20 | awk '{print $9, $5}'

由于

ls
的输出是柱状的,只需打印正确的列即可完成。


0
投票

xargs
获取上一个命令的每一行输出,并基本上在其参数末尾进行拍打,因此您的查找结果打印类似

123 ./somefile.txt 

xargs
变成

ls -lS 123 ./somefile.txt

除非您在该目录中确实有一个名为

123
的文件,否则您会收到“无法访问”错误:

marc@panic:~$ touch foo
marc@panic:~$ ls -lS file_that_does_not_exist foo
ls: cannot access file_that_does_not_exist: No such file or directory
-rw-rw-r-- 1 marc marc 0 Feb  3 14:26 foo
© www.soinside.com 2019 - 2024. All rights reserved.