har*_*pus 6 linux find sort files
试图查找名称中包含特定字符串但不知道如何对输出进行排序的文件,在某种程度上,我只会获取文件名。
我试过了
OLDDATA=`find . -regex ".*/[0-9.]+" | ls -t`
Run Code Online (Sandbox Code Playgroud)
但是 ls -t 不是在查找结果上工作,而是在整个目录上工作
编辑:此语句的结果应按修改日目录排序。此正则表达式假设匹配名称中仅包含数字和点的目录。
仅获取文件名...按修改日期排序
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)
您的方法可以适用于简单的情况。您面临的主要问题是您将输入传递给ls
,但ls
不接受任何输入。ls
接受命令行参数。因此,您需要使用命令替换将 的输出find
作为参数传递给ls
。此外,如果目录匹配,传递-d
到ls
以列出目录本身而不是其内容。
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
Run Code Online (Sandbox Code Playgroud)
只在简单的情况下,因为有两个限制:
$OLDDATA
)。因此,它假定文件名不包含任何特殊字符(空格或通配符\[*?
)。ls
可能会破坏在当前语言环境中不可打印的字符。find … -exec
并xargs
无济于事,因为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 次 |
最近记录: |