Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux unix文件按日期搜索,从最近创建到最近创建_Linux_Unix_Grep - Fatal编程技术网

Linux unix文件按日期搜索,从最近创建到最近创建

Linux unix文件按日期搜索,从最近创建到最近创建,linux,unix,grep,Linux,Unix,Grep,在文件夹a时间下午6点,我用文本abc创建文件6 在文件夹a/b时间晚上7点,我创建了带有文本abc的文件7 在文件夹a时间晚上8点,我用文本abc创建文件8 在文件夹a中,我想搜索所有文本为abc的文件,按最近创建的文件到最近创建的文件排序。我通过ls-hlt | grep-irabc*搜索我的结果是 6:abc 8:abc b/7:abc 但是我想要下面的。我该怎么做 8:abc b:\7:abc 6:abc 更新:ls-lt | grep-irabc*可以很好地使用abc返回文件,从最

在文件夹
a
时间下午6点,我用文本abc创建文件
6

在文件夹
a/b
时间晚上7点,我创建了带有文本abc的文件
7

在文件夹
a
时间晚上8点,我用文本abc创建文件
8

在文件夹a中,我想搜索所有文本为abc的文件,按最近创建的文件到最近创建的文件排序。我通过
ls-hlt | grep-irabc*
搜索我的结果是

6:abc
8:abc
b/7:abc
但是我想要下面的。我该怎么做

8:abc
b:\7:abc
6:abc

更新:
ls-lt | grep-irabc*
可以很好地使用abc返回文件,从最旧到最新,其中“ls-lt”显示从新到旧的文件。不知道为什么grep会干扰流量,我想这是你想要的。 它将显示带有“abc”字样的文件。最新的第一

ls -Rt1 | grep "*abc*"

大问题被分解成小问题

  • 查找包含“abc”的所有文件,忽略案例
  • 打印每个文件名及其自创建以来的时间
  • 按日期对filanames列表进行排序
  • 从保留文件名的列表中删除创建日期
所以它是:

grep -irl ABC . |
xargs -d$'\n' -n1 sh -c 'printf "%s\t%s\n" "$(stat -c "%W" "$1")" "$1"' -- |
sort -n -k1 |
cut -f2-
使用测试(注意
stat-c“%Y”
vs
stat-c“%W”
):

关于:


解析诸如
ls
find
之类的命令时存在一般性问题。这是因为当文件名具有特殊字符时,它们会变得非常有趣。你可以阅读更多关于这个和

最常用的方法是创建一个文件列表,其中文件名由空字符
(\0)
分隔。GNU grep可以使用
-Z
标志创建这样的列表:

-Z,--null
输出一个零字节(ASCII NUL字符),而不是通常在文件名后面的字符。例如,
grep-lZ
在每个文件名后输出一个零字节,而不是通常的换行符。此选项使输出明确无误,即使文件名包含不寻常的字符,如换行符。此选项可与
find-print0
perl-0
sort-z
、和
xargs-0
等命令一起使用,以处理任意文件名,即使是包含换行符的文件名

来源:
man grep

我们现在可以在OP的问题中使用它:

$ grep -lZR "abc" a/
将为我们提供一个空分隔的文件列表,这些文件现在可以存储在一个数组中以供进一步处理(请参阅)

unset a i
而IFS=read-r-d$'\0'文件;做
[i++]=“$file”#或您希望处理每个文件的方式

完成<大多数linuxs文件系统通常不保留创建文件名的时间。那么您如何从上次修改到按该顺序获得预期的文件列表?我不理解
b:\7:abc
输出,
\7
从何而来?那不是
b/7:abc
?Och,文件夹分隔符是\吗?或者文件名是按字面意思命名的
b:\7
(4个字符)?或者你混合使用了
/
作为文件夹分隔符?这是个错误。是正斜杠,不是反斜杠@KamilCukSomething不清楚,您想按修改时间排序,还是您在示例中给出的时间是文件名的一部分(文件名7表示文件创建时间为7pm),我得到错误,没有这样的命令,例如
ls-Rt1
Rt1似乎无效。请分别尝试这些命令以查看是谁出错ls-R ls-t ls-1请注意,除非您使用的是记录创建时间的文件系统
stat-c“%W”
将报告0作为创建时间。
./a/6
./a/b/7
./a/8
$ grep -lZR "abc" a/
$ ls -lrt "${a[@]}"