【问题标题】:Bash command: headbash 命令:head
【发布时间】:2022-01-22 07:03:49
【问题描述】:

我正在尝试在名为dummy 的文件夹中查找所有带有dummy* 的文件。然后我需要根据创建时间对它们进行排序并获取第一个 10 个文件。我正在尝试的命令是:

find -L /home/myname/dummy/dummy* -maxdepth 0 -type f -printf '%T@ %p\n' | sort -n | cut -d' ' -f 2- | head -n 10 -exec readlink -f {} \;

但这似乎不适用于以下错误:

head: invalid option -- 'e'
Try 'head --help' for more information.

如何使 bash 不读取 -exec 作为 head 命令的一部分?

更新1:

尝试了以下方法:

find -L /home/myname/dummy/dummy* -maxdepth 0 -type f -exec readlink -f {} \; -printf '%T@ %p\n' | sort -n | cut -d' ' -f 2- | head -n 10

但这不是根据时间戳排序,因为 find 和 printf 都在打印文件,而 sort 将它们全部排序在一起。

dummy中的文件如下: dummy1、dummy2、dummy3 等。这是它们的创建顺序。

【问题讨论】:

  • 谢谢。我知道-exec 不是head 的有效选项。因此UPDATE1。请检查一下
  • 顺便说一句,您的处理方式非常复杂。鉴于您无论如何都假设文件名不包含换行符,使用ls -cr 比使用find + sort + cut 要容易得多。

标签: bash shell command-line command command-line-arguments


【解决方案1】:

如何使 bash 不将 -exec 作为 head 命令的一部分读取?

-exec 和后续参数似乎旨在指向findfind 命令在第一个 | 处停止,因此您需要将这些参数移到前面:

find -L /home/myname/dummy/dummy* -maxdepth 0 -type f -printf '%T@ %p\n' -exec readlink -f {} \; | sort -n | cut -d' ' -f 2- | head -n 10

但是,同时 -printf 文件详细信息和-exec readlink 结果没有多大意义。可能你想在每个超过head 的文件名上运行readlink。在这种情况下,您可能需要查看xargs 命令,该命令的作用正是将从标准输入读取的数据转换为命令的参数。例如:

find -L /home/myname/dummy/dummy* -maxdepth 0 -type f -printf '%T@ %p\n' |
  sort -n |
  cut -d' ' -f 2- |
  head -n 10 |
  xargs -rd '\n' readlink -f

【讨论】:

    【解决方案2】:

    我认为你在这里过于复杂了。只使用 lshead 应该可以得到你想要的结果:

    ls -lt /home/myname/dummy/dummy* | head -10

    要具体按 ctime 排序,请为 ls 使用 -c 标志:

    ls -ltc /home/myname/dummy/dummy* | head -10

    【讨论】:

    • 感谢您的回复,但有时我可能无法提供整个文件路径。我确实需要使用find 而不是ls
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多