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 CONDITION120replace为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中的函数 )。