【问题标题】:Find + ls -lT in compound command在复合命令中查找 + ls -lT
【发布时间】:2013-01-29 20:02:59
【问题描述】:

要获取文件的完整时间戳,我可以这样做:

$ ls -lT

但是,当我尝试以下操作时:

find . -ls -lT

我得到一个find: -lt: unknown primary or operator(使用find . -ls 有效)。

使用find + ls -lT 命令的正确方法是什么?

【问题讨论】:

  • 你在什么操作系统上,哪个版本的ls? ls: 选项需要一个参数 -- 'T' 另外,find 中的 ls 与操作系统不同。试试 -exec ls -1T {}+

标签: linux bash shell unix find


【解决方案1】:

find "-ls" 选项没有运行 ls 并且不接受它的所有参数。也就是说,我不知道你为什么想要 -T 参数,这是一个涉及制表位的晦涩难懂的东西,我必须查找它。但从广义上讲,您只想对 find 找到的一堆文件运行一个命令(在本例中为“ls -lT”)。因此,以下任何一个都应该有效:find . -type f | xargs -n1 ls -lTfind . -type f -exec ls -lT {} ';'for i in $(find . -type f); do ls -lT $i; done

或者,对于需要多个命令行参数的 ls 的特殊情况,只需 find . -type f | xargs ls -lT

【讨论】:

  • 你应该使用find . -type f -exec ls -lT {} +(高效)或find . -type f -exec ls -lT {} ';'(兼容pre-posix工具)。 find/xargs 变体和 for 循环将在带有空格等的文件名上失败
  • 一切都是对的,尽管这会让我们进入 -print0/-0 和各种其他细节。我的意思只是说这是一个普遍的问题,它有很多通用的解决方案。
【解决方案2】:

如果您正在解析ls 的输出,那么您做错了。与文件系统交互总是比解析人类可读的输出更好。

我不确定您所说的“文件的完整时间戳”是什么意思,但如果您想知道上次修改时间,请使用 stat

stat --printf='%x' foo 
2013-01-29 13:33:32.000000000 -0600

运行 man stat 以查看 --printf 参数中的所有其他格式选项。

【讨论】:

  • 感谢您的解释。那么我如何获得数十万个文件的stat(我需要将其加载到数据库中)?
猜你喜欢
  • 2017-02-23
  • 2018-05-04
  • 2017-08-09
  • 1970-01-01
  • 2015-10-23
  • 2020-05-29
  • 2013-01-25
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多