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

n1bvdmb6  于 5个月前  发布在  Linux
关注(0)|答案(5)|浏览(83)

所以我有这个命令行。

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

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

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


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

vfhzx4xs

vfhzx4xs1#

一个不涉及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个项目。

yvt65v4c

yvt65v4c2#

在Linux下使用下面的命令获取文件的大小。

du -h <<FileName>>

字符串

du -h <<FilePath>>

rdlzhqv9

rdlzhqv93#

你在问题中说:
我的目标是打印目录中最大的20个文件,而不是使用ls。
这意味着可接受的解决方案 * 不应该使用 * ls
另一个问题是xargs的使用。像find . -type f | xargs ls这样的结构将不适用于包含白色空格的文件或文件名,因为它将在将字符串交给ls之前将字符串从find中分离出来。您可以保护字符串或使用空终止字符串解决此问题,例如find . -type f -print0 | xargs -0 ls。通常情况下,使用xargssecurity considerations。与其验证你的xargs结构是否安全,还不如完全避免使用它(特别是如果你不需要它)。
尝试打印不带ls和不带xargs的20个最大文件:

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

字符串

jdzmm42g

jdzmm42g4#

第一个月
由于ls的输出是列式的,因此只需打印适当的列即可。

jfewjypa

jfewjypa5#

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

相关问题