对不起,如果这是一个简单的问题,但我是Bash脚本的新手,我的谷歌技能让我失望了。我正在尝试编写一个脚本,该脚本最终将检查目录中每个文件的上次修改时间,如果文件上次修改> 3 天前,则使用 gzip 压缩该文件。我目前可以使用我的脚本在这里打印出上次修改的时间:
1 !#/bin/bash
2 echo "Enter directory"
3
4 read directory
5
6 for entry in "$directory"/*
7 do
8 stat -f "%Sm" "$entry"
9 done
这很好地打印出时间:
Randalls-MacBook-Pro:bash_scripts randallbanks$ ./print_last_modified.sh
./print_last_modified.sh: line 1: !#/bin/bash: No such file or directory
Enter directory
..
Apr 6 13:12:21 2015
Apr 19 18:50:26 2015
Apr 14 11:29:06 2015
Apr 7 12:26:37 2015
Apr 15 16:05:17 2015
Apr 6 16:28:06 2015
Apr 6 12:28:40 2015
Apr 6 12:28:40 2015
Apr 6 12:28:40 2015
Apr 6 12:28:40 2015
Apr 23 17:03:03 2015
但是我无法弄清楚如何存储或解析这些内容,以便我可以检查它们的上次修改时间是否> 3 天前。我该怎么做?
编辑:奖励问题:它显然不认识我在标题中的 shebang 是怎么回事?
要 gzip 上次修改时间在 3 天或更长时间前的文件,请使用:
find "$directory" -mtime +2 -type f -exec gzip {} ;
如果您的find
足够现代,请使用:
find "$directory" -mtime +2 -type f -exec gzip {} +
工作原理
find "$directory"
这
find
$directory
下的目录树中查找文件开始。-mtime +2
这将查找修改超过 2 天的文件。 (超过 2 表示三个或更多)。 有关
find
如何计算舍入到天数的年龄的详细信息,请参阅man find
。-type f
这将
find
限制为查找常规文件。-exec gzip {} ;
这会告诉
find
gzip
找到的文件。
你的 shebang 是 bangshe。它应该是#!
的;这是!#
.
OS X(通常和BSD)上的find
命令可以完成您要查找的操作。-newermt
根据字符串中指定的时间检查修改时间,包括 "3 days ago"
等字符串。
所以:
find . -not -newermt "3 days ago" -exec gzip {} ;