Shell脚本 – 获取<date>后修改的所有文件
我宁愿不在PHP中这样做,所以我希望有一个体面的shell脚本可以帮助。
我需要一个以recursion方式运行目录的脚本,并且发现所有上次修改date的文件都大于某个date。 然后,它将打开并压缩文件保存path信息。
如下简单:
find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz
在哪里find . -mtime -1
find . -mtime -1
将select修改前一天(recursion)当前目录中的所有文件。 你可以使用分数,例如:
find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
如果你有GNU的find
,那么有一大堆相关的select。 唯一的障碍是它们的界面不如恒星:
-
-mmin n
(修改时间(分钟) -
-mtime n
(修改时间,以天为单位) -
-newer file
(修改时间比-newer file
修改时间更新) -
-daystart
(调整从当前时间到开始时间的开始时间) - 另外还可以select访问时间和“更改”或“创build”时间。
困难的部分是确定一段时间以来的分钟数。
一个值得考虑的select:使用touch
创build一个具有所需修改时间戳的文件; 然后用-newer
find
。
touch -t 200901031231.43 /tmp/wotsit find . -newer /tmp/wotsit -print rm -f /tmp/wotsit
这会查找比2009-01-03T12:31:43更新的文件。 显然,在一个脚本中, /tmp/wotsit
将会是一个带有PID或其他值的名称,以使其唯一; 而且即使用户中断,也会有一个trap
来确保它被删除,等等。
你可以用tar直接做,甚至更好:
tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files
这指示tar压缩比2014年1月1日18:00:00更新的文件。
这将适用于一些文件。 如果任何path中有空格,则需要包含“-print0”和“xargs -0”。 本示例查找在过去7天内修改的文件。 要查找最近7天之前修改的内容,请使用“+7”。
find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2
在这个页面发出警告时,如果有很多参数,xargs会导致tar命令被多次执行,而“-c”标志可能会导致问题。 在这种情况下,你会想这样做:
find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar
你不能使用tar更新压缩的tar压缩文件,所以你必须在第二步中使用bzip2或gzip压缩。
这应该显示在过去7天内修改的所有文件。
find . -type f -mtime -7 -print
把它变成焦油/拉链,你应该很好。
在linux下尝试阅读find命令的man页面
man find
像这样的东西应该
find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9
你有它
你可以得到最近修改的时间晚于x天前的文件列表:
find . -mtime -x
那么你只需要在结果列表中tar和压缩文件,例如:
tar czvf mytarfile.tgz `find . -mtime -30`
为上个月修改的所有文件。
该脚本将查找在给定date之前和之后修改date为两分钟的文件(并且可以按照您的要求更改条件中的值)
PATH_SRC="/home/celvas/Documents/Imp_Task/" PATH_DST="/home/celvas/Downloads/zeeshan/" cd $PATH_SRC TODAY=$(date -d "$(date +%F)" +%s) TODAY_TIME=$(date -d "$(date +%T)" +%s) for f in `ls`; do # echo "File -> $f" MOD_DATE=$(stat -c %y "$f") MOD_DATE=${MOD_DATE% *} # echo MOD_DATE: $MOD_DATE MOD_DATE1=$(date -d "$MOD_DATE" +%s) # echo MOD_DATE: $MOD_DATE DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ] DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ] #echo DIFF: $DIFF_IN_DATE #echo DIFF1: $DIFF_IN_DATE1 if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]] then echo File lies in Next Hour = $f echo MOD_DATE: $MOD_DATE #mv $PATH_SRC/$f $PATH_DST/$f fi done
例如,只需要在给定date之前具有修改date的文件,则可以在$DIFF_IN_DATE
参数$DIFF_IN_DATE
120
更改为0
, $DIFF_IN_DATE
丢弃$DIFF_IN_DATE
参数的条件。
同样的,如果你想在给定date之前和之后1小时有修改date的文件,只要在if CONDITION
将120
replace为3600
。
我只是简单地做以下操作来备份7天前的所有新文件
tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .
请注意,您也可以使用任何符合您需要的内容replace“7天前”
可以是: date -d'yesterday' +"%d-%b"
甚至: date -d'first Sunday last month' +"%d-%b"
切出这个GitHub仓库: ZFYL /拉链
如果你把index.php和zipper.php放在你的服务器的任何地方,通过mainpage你可以看到两个date之间修改过的文件,或者zip-them。
主要function:
- search目录recursion
- 查找在给定的两个date/时间之间修改的文件
- 列出这些文件
- ZIP这些文件
- 用RegEx排除path
顺便说一句,这个PHP工具超级快,在最坏的情况下可以在5秒内运行20 000个文件 。
你也可以在任何PHP文件中包含zipper.php代码库,并调用内置的函数,你可以在代码库的维基中find它( 使用ZFYL zipper中的函数 )。