我有一个目录中的一组文件。我需要找到一组特定日期的文件(例如,如果我需要从1月16日到1月20日的文件)。我尝试使用 ls -ltr | grep <date>
,但这需要太多步骤来选择文件。有没有更简单的方法来完成这项任务。谢谢!
我不确定您的目录中有多少个文件,但像这样的操作应该非常快:
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
会在那里放置年份。我模糊地记得这大约是在六个月左右的边界处,但我并不完全确定。你还需要考虑这一点。
使用find(1)
代替,这样会更容易。
find . -mtime -$start -mtime +$end
find
命令有一个 -newer
标志(用于查看它是否比另一个文件更新),但不幸的是没有 -older
标志。我不确定它是否适用于这些非常特定的日期范围。 - paxdiablo!
(非)运算符)。 - wich最好使用find
。首先创建两个临时文件,指定搜索时间范围。可以使用touch
命令完成:
touch -t "201301160001" ./start
touch -t "201301202359" ./finish
find
:find /path/to/files -type f -newer ./start ! -newer ./finish
ls
输出),但是OP确实希望用这种方式完成,而awk
是一个很好的选择。 - Steve./script.sh
、bash script.sh
还是source script.sh
)。我认为这与感叹号有关;当我使用bash -x
进行调试时,它被单引号包围;以这种方式运行命令不返回任何内容。 - jimjamslam