如何按日期对Find语句的结果进行排序?

har*_*pus 6 linux find sort files

试图查找名称中包含特定字符串但不知道如何对输出进行排序的文件,在某种程度上,我只会获取文件名。

我试过了

OLDDATA=`find . -regex ".*/[0-9.]+" | ls -t`
Run Code Online (Sandbox Code Playgroud)

但是 ls -t 不是在查找结果上工作,而是在整个目录上工作

编辑:此语句的结果应按修改日目录排序。此正则表达式假设匹配名称中仅包含数字和点的目录。

Rom*_*est 7

仅获取文件名...按修改日期排序

find+ sort+cut方法:

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort | cut -d' ' -f2
Run Code Online (Sandbox Code Playgroud)
  • %T@-文件的最后修改时间,这里@,因为Jan. 1, 1970, 00:00 GMT,有小数部分

  • %f - 删除任何前导目录的文件名(仅最后一个元素)


要按降序排序:

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort -k1,1r | cut -d' ' -f2
Run Code Online (Sandbox Code Playgroud)

  • 好的 ol' Schwartzian 变换 (4认同)

Gil*_*il' 5

您的方法可以适用于简单的情况。您面临的主要问题是您将输入传递给ls,但ls不接受任何输入。ls接受命令行参数。因此,您需要使用命令替换将 的输出find作为参数传递给ls。此外,如果目录匹配,传递-dls以列出目录本身而不是其内容。

OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
Run Code Online (Sandbox Code Playgroud)

只在简单的情况下,因为有两个限制:

  1. 这依赖于未加引号的命令替换(以及after的使用$OLDDATA)。因此,它假定文件名不包含任何特殊字符(空格或通配符\[*?)。
  2. 的某些版本ls可能会破坏在当前语言环境中不可打印的字符。
  3. 如果文件名的总长度太长,则会出现错误。(请注意,在这里find … -execxargs无济于事,因为ls必须运行一次才能使文件名的顺序正确。他们所能做的就是隐藏错误并产生未正确排序的输出 - 并在这种情况下再处理几个字符的xargs。)

一个强大而简单的方法是使用zsh。由于glob qualifiers,它能够对通配符匹配进行排序。

setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
Run Code Online (Sandbox Code Playgroud)
  • 由于这不会调用任何其他程序,因此除了可用内存之外没有长度限制,并且在任何时候都没有文件名修改的风险。
  • 结果是一个字符串列表(每个字符串都是一个文件名),而不是一个字符串,因此它进入一个数组变量。
  • **/递归遍历子目录,避免使用find.
  • ##在 zsh 扩展的 glob 语法中表示“前面的一个或多个”,它类似于+(扩展的)正则表达式语法。
  • (om)是一个全局限定符,用于按修改时间对文件进行排序,例如ls -t.

众所周知,没有简单的方法可以使用 POSIX 工具甚至 GNU 工具和 ksh 稳健地做到这一点。


归档时间:

查看次数:

5200 次

最近记录:

7 年,10 月 前