如何在Unix中使用ls命令查找特定日期的文件

15

我有一个目录中的一组文件。我需要找到一组特定日期的文件(例如,如果我需要从1月16日到1月20日的文件)。我尝试使用 ls -ltr | grep <date> ,但这需要太多步骤来选择文件。有没有更简单的方法来完成这项任务。谢谢!


Shash,请思考一下被接受的答案,我认为find可能是更好的工具。 - paxdiablo
@paxdiablo 好的,即使那样也会尝试。 - Shash
3个回答

21

我不确定您的目录中有多少个文件,但像这样的操作应该非常快:

ls -al | awk '$6 == "Jan" && $7 >= 16 && $7 <= 20 {print $9}'

在我的系统上,我看到以下内容(日期稍作修改):

pax> ls -al | awk '$6 == "Jan" && $7 >= 16 && $7 <= 29 {print $9}'
kids_shares.ods
our_savings.gnumeric
photos

pax> ls -ald kids_shares.ods our_savings.gnumeric photos
-rw-r--r--   1 pax pax 51005 Jan 29 19:39 kids_shares.ods
-rw-r--r--   1 pax pax  2275 Jan 28 14:48 our_savings.gnumeric
drwxrwxrwx 130 pax pax  4096 Jan 29 21:47 photos

你可以看到给定文件的日期是匹配的。

需要注意的一点是:如果文件是最近的,它将在第8列中有一个时间。超过某个年龄,ls会在那里放置年份。我模糊地记得这大约是在六个月左右的边界处,但我并不完全确定。你还需要考虑这一点。


12

使用find(1)代替,这样会更容易。

find . -mtime -$start -mtime +$end

find 命令有一个 -newer 标志(用于查看它是否比另一个文件更新),但不幸的是没有 -older 标志。我不确定它是否适用于这些非常特定的日期范围。 - paxdiablo
@paxdiablo 这很合适,我刚刚添加了一个例子(另外,find有!(非)运算符)。 - wich
哦,我没有想到那个。好主意。 - paxdiablo

8

最好使用find。首先创建两个临时文件,指定搜索时间范围。可以使用touch命令完成:

touch -t "201301160001" ./start
touch -t "201301202359" ./finish

然后运行find:
find /path/to/files -type f -newer ./start ! -newer ./finish

实际上,这两种基于查找的解决方案可能比我的更好 - 只需使用maxdepth(如果您不想进入子目录)。对于两者都加1。 - paxdiablo
@paxdiablo:谢谢老兄。我回应是因为(虽然我不喜欢解析ls输出),但是OP确实希望用这种方式完成,而awk是一个很好的选择。 - Steve
这对我交互式地工作得很好,但在脚本中使用时没有结果(无论是使用./script.shbash script.sh还是source script.sh)。我认为这与感叹号有关;当我使用bash -x进行调试时,它被单引号包围;以这种方式运行命令不返回任何内容。 - jimjamslam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接