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

4

我有一个可用的命令行。

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

我只想输出文件大小和名称。我尝试了以下代码:

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

但是这给我带来了许多“无法访问[inode],没有这样的文件或目录”的错误。我的目标是打印目录中最大的20个文件,而不使用ls命令。

4
只需执行 find . -type f -printf '%s %p\n' 命令,不要使用 xargs - Kenney
那确实能起作用,但我希望输出最大的20个文件,所以我需要使用xargs和head命令。 - user5552734
5个回答

3
没有使用ls命令的答案:
find . -type f -printf '%k %p\n' |sort -n |tail -n 20

这将列出每个文件的大小(以kB为单位),并在文件名前加上一个空格,按数字排序,然后获取最后20个项目(即20个最大的项目)。
你的问题在于将管道连接到ls命令上。
如果你有一个非常庞大的目录结构,sort命令会崩溃。你需要使用自定义代码来仅存储最大的20个项目。

2

使用以下命令获取Linux文件的大小:

du -h <<FileName>>

或者

du -h <<FilePath>>

2
问题中提到:
“我的目标是打印出目录中最大的20个文件,而不使用ls。”
这意味着一个可接受的解决方案不应该使用ls
另一个问题是xargs的使用。类似于find . -type f | xargs ls的结构将无法处理包含空格的子目录或文件名,因为它会在将其传递给ls之前拆分来自find的字符串。您可以保护字符串或使用空字符终止的字符串来解决此问题,例如find . -type f -print0 | xargs -0 ls。通常,使用xargs存在安全考虑。如果您不需要它,避免使用它可能更容易,而不是验证您的xargs构造是否安全。
尝试在不使用lsxargs的情况下打印出最大的20个文件:
    find . -type f -printf '%s %p\n' | sort -rn | head -20

1

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

由于ls的输出是按列排列的,只需打印正确的列即可完成。


欢迎来到 awk 的奇妙世界 - 下一站是使用 cat some.csv | awk '{s+=$4} END {print s/NR}' 求平均值。 - Anton Drukh
2
如果文件名包含空格会发生什么? - e0k
2
@e0k 这个回答的代码完全错误了...(空格或引号会破坏它)。看来我们正在经历新一波非常糟糕的回答... - gniourf_gniourf
感谢您指出这里的限制!确实,80%/20%类型的答案不应在不了解awk的限制的情况下使用。 - Anton Drukh
只有当 find 命令的输出结果不大,以至于 xargs 能够将其放入一个 ls 命令调用中时,此命令才有效。否则,它会将结果分成多个 ls 命令调用,并且每个列表都会被排序,但你只会看到 xargs 第一次调用 ls 时的前20个最大文件。 - Adam Katz

0

xargs会将前一个命令的每一行输出作为参数添加到其末尾,因此您的find命令会打印类似以下内容:

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

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