使用 sed 列出文件的日期

使用 sed 列出文件的日期

我正在尝试使用 提取修改日期/上周修改日期的文件和文件夹,sed但很费劲。这是我的意见,
ls -l | sed '/codehere//g'
但我不知道如何进行这种过滤,除了使用awk

我的命令的输出ls -l

vladimir@vladimir-K54L ~/Desktop $ ls -l
total 140
-rw-r--r-- 1 vladimir vladimir   516 Feb 27 19:33 4taOS.zip
-rw-r--r-- 1 vladimir vladimir 63092 Feb 18 18:14 angela.jpg
-rw-r--r-- 1 vladimir vladimir     0 Mar  4 00:23 _cmd.txt
-rw-r--r-- 1 vladimir vladimir     5 Feb 27 19:26 dat1.txt
-rw-r--r-- 1 vladimir vladimir     5 Feb 27 19:26 dat2.txt
-rw-r--r-- 1 vladimir vladimir     5 Feb 27 19:26 dat3.txt
-rw-r--r-- 1 vladimir vladimir     5 Feb 27 19:26 dat4.txt
-rw-r--r-- 1 vladimir vladimir     5 Feb 27 19:26 dat5.txt
-rw-r--r-- 1 vladimir vladimir     5 Feb 27 19:26 dat6.txt
-rw-r--r-- 1 vladimir vladimir   226 Feb 24 13:21 java.html
-rwxr-xr-x 1 vladimir vladimir   299 Feb 27 19:27 lab1.sh
-rwxr-xr-x 1 vladimir vladimir   615 Mar  5 00:36 labperl2.plx
-rw-r--r-- 1 vladimir vladimir    18 Mar  3 12:44 naredbi.txt
-rwxr-xr-x 1 vladimir vladimir  1105 Mar  3 12:51 OSPRVKOL2015.plx
-rwxr-xr-x 1 vladimir vladimir   187 Feb 27 19:13 perl.plx
-rw-r--r-- 1 vladimir vladimir   257 Feb 23 21:44 primer
-rwxr-xr-x 1 vladimir vladimir   136 Feb 23 21:55 prva.sh
-rwxr-xr-x 1 vladimir vladimir    44 Feb 23 21:56 treta.sh
-rw-r--r-- 1 vladimir vladimir   137 Mar  4 23:17 vlade.txt
-rw-r--r-- 1 vladimir vladimir    67 Mar  3 12:44 vlez.txt
-rwxrwxrwx 1 vladimir vladimir   110 Feb 23 21:52 vtora.sh  

所以我只需要打印出文件名,例如vtora.sh取决于修改的日期(仅限上周)。

答案1

首先,你真的不想这样做。解析的输出ls很容易出错,而且有更好的方法可以实现你想要的结果(find例如)。但是,我怀疑你的老师想让你学习正则表达式,只是用这个作为例子。无论如何,我当然希望如此。

无论如何,这将适用于您在问题中显示的输出以及本周的输出。它将在下周失败,并且如果您的文件名中有空格或其他奇怪的内容,它将失败。除了上周之外,它将在任何其他日期失败。也就是说,它确实适用于您的示例:

$ ls -l | sed -En ' s/.*Feb *2[6-8].* (.*)/\1/p; s/.*Mar *[1-4].* (.*)/\1/p; '
4taOS.zip
_cmd.txt
dat1.txt
dat2.txt
dat3.txt
dat4.txt
dat5.txt
dat6.txt
lab1.sh
naredbi.txt
OSPRVKOL2015.plx
perl.plx
vlade.txt
vlez.txt

我使用的是-E激活扩展正则表达式的运算符(如果没有这个运算符,我需要转义(and )),而-n这意味着“除非我告诉您,否则不要打印”。然后,替换运算符会查找Feb 2与 6 到 8 之间的任何数字(二月的最后一周)或Mar1-4 之间的任何数字(三月的最后一周的日期)匹配的行。如果这些行匹配,它会用最后一串非空格字符替换行上的所有内容。这就是括号的作用:它们“捕获”一个模式,以便可以在替换的右侧使用它。

答案2

terdon 的回答提供适合教授要求的解决方案。我想提供一个合适的解决方案。虽然在课堂上遵循指示当然是好的和勤奋的,但理论和实践往往有所不同,教授在课程中教授/要求的内容有时并不专业,你不想被经理/客户大喊大叫。

正确的做法应该是:

$ find . -maxdepth 1  -type f -mtime -7

其工作方式很简单:

  • find是一个递归遍历目录树的命令。在本例中,我们在 Ubuntu 上使用GNU find
  • 下一个参数是 location - 我们要遍历的父目录。在这种情况下.可以省略并自动假定。在其他操作系统上find(如果我没记错的话,是 BSD find)可能需要这样的选项。
  • -maxdepth 1限制我们仅列出当前目录中的文件。
  • -type f将限制输出仅限于文件。
  • -mtime -7将过滤掉修改时间为-7几天(即一周)的文件。

相关内容