【问题标题】:How can I print out only the name and file size using the find command?如何使用 find 命令仅打印名称和文件大小?
【发布时间】:2016-05-13 05:36:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 只需执行find . -type f -printf '%s %p\n' 并删除xargs。
  • 确实有效,但我希望输出最大的 20 个文件,所以我需要那些 xargs 和 head。

标签: linux bash command-line find printf


【解决方案1】:

不涉及ls 的答案:

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

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

你的问题在于ls的管道。

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

【讨论】:

    【解决方案2】:

    在问题中,您说:

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

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

    另一个问题是xargs 的使用。像find . -type f | xargs ls 这样的结构不适用于包含空格的子目录或文件名,因为它会在将字符串从find 拆分出来之前将其分配给ls。您可以保护字符串或使用以空结尾的字符串(例如find . -type f -print0 | xargs -0 ls)来解决此问题。一般来说,有security considerations使用xargs。与其验证您的 xargs 构造是否安全,不如完全避免使用它(尤其是在您不需要它的情况下)。

    尝试打印不带ls 和不带xargs 的20 个最大文件:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 欢迎来到awk 的精彩世界——下一站是用cat some.csv | awk '{s+=$4} END {print s/NR}' 求平均值
      • 如果文件名中包含空格会怎样?
      • @e0k 这个答案中的代码完全被破坏了......(空格或引号会严重破坏它)。看来我们正在收到新一波非常糟糕的答案……
      • 感谢您指出这里的限制!确实是 80%/20% 类型的答案,不了解awk 的限制就不要使用
      • 这仅在 find 的输出足够小以使 xargs 可以放入对 ls 的单个调用时才有效。否则,它会将结果拆分为 ls 的多次运行,并对每个团块进行排序,但您只会看到 xargs 调用的 first ls 中最大的 20 个。
      【解决方案4】:

      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
      

      【讨论】:

        【解决方案5】:

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

        du -h <<FileName>>
        

        或者

        du -h <<FilePath>>
        

        【讨论】:

          猜你喜欢
          • 2010-09-09
          • 2021-06-07
          • 1970-01-01
          • 1970-01-01
          • 2014-09-24
          • 2023-02-02
          • 2019-09-02
          • 2018-04-14
          • 1970-01-01
          相关资源
          最近更新 更多