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

时间:2016-02-03 20:21:57

标签: linux bash command-line find printf

所以我有这个命令行可以工作。

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

问题是我只希望输出为文件大小和名称。我试过了:

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

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

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

5 个答案:

答案 0 :(得分:2)

在问题中,您声明:

  

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

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

另一个问题是使用xargs。类似find . -type f | xargs ls的构造不适用于包含空格的子目录或文件名,因为它会在将字符串find分割之前将其分割为ls。您可以使用空终止字符串保护字符串或解决此问题,例如find . -type f -print0 | xargs -0 ls。通常,使用xargssecurity considerations。与其验证xargs构造是否安全无关,而不是完全避免使用它(特别是如果您不需要它)。

尝试打印没有ls且没有xargs的最大的20个文件:

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

答案 1 :(得分:2)

没有ls的答案:

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

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

你的问题出现在ls

如果你有一个真正的大目录结构,sort将会失败。您必须使用仅存储最多20个项目的自定义代码。

答案 2 :(得分:0)

使用以下命令获取linux中的文件大小。

du -h <<FileName>>

或者

du -h <<FilePath>>

答案 3 :(得分: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

答案 4 :(得分:0)

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

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