Shell脚本 - 获取在<date> </date>之后修改的所有文件

时间:2009-05-11 14:10:03

标签: unix shell

我宁愿不在PHP中这样做,所以我希望有一个体面的shell脚本可以提供帮助。

我需要一个以递归方式运行目录的脚本,并查找上次修改日期的所有文件都大于某个日期。然后,它将tar和zip文件保留路径信息。

9 个答案:

答案 0 :(得分:130)

简单如下:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

其中find . -mtime -1将选择(递归)当前目录中修改前一天的所有文件。你可以使用分数,例如:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz

答案 1 :(得分:89)

如果你有GNU find,那么有很多相关选项。唯一的障碍是它们的接口不是恒星:

  • -mmin n(修改时间以分钟为单位)
  • -mtime n(修改时间以天为单位)
  • -newer file(修改时间比文件的修改时间更新)
  • -daystart(调整从当前时间到开始的开始时间)
  • 可选择访问时间和“更改”或“创建”时间。

困难的部分是确定自一段时间以来的分钟数。

值得考虑的一个选项:使用touch创建具有所需修改时间戳的文件;然后将find-newer一起使用。

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

这会查找比2009-01-03T12:31:43更新的文件。显然,在脚本中,/tmp/wotsit将是具有PID或其他值的名称,以使其唯一;并且有一个trap以确保即使用户中断也会被删除,等等。

答案 2 :(得分:31)

你可以直接用tar做到这一点,甚至更好:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

这指示tar压缩比2014年1月1日18:00:00更新的文件。

答案 3 :(得分:17)

这适用于一些文件。如果任何路径中包含空格,您希望包含“-print0”和“xargs -0”。此示例查找过去7天内修改的文件。要查找在过去7天之前修改过的内容,请使用“+7”。

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

this page发出警告时,如果有很多参数,xargs会导致tar命令多次执行,而“-c”标志可能会导致问题。在这种情况下,你会想要这个:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

您无法使用tar更新压缩的tar存档,因此您必须在第二步中使用bzip2或gzip。

答案 4 :(得分:12)

这应显示过去7天内修改的所有文件。

find . -type f -mtime -7 -print

把它管成tar / zip,你应该很好。

答案 5 :(得分:3)

在linux下尝试阅读find命令的手册页

man find

这样的事情

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

你有它

答案 6 :(得分:3)

您可以使用以下命令获取上次修改时间超过x天前的文件列表:

find . -mtime -x

然后你只需要在结果列表中tar和zip文件,例如:

tar czvf mytarfile.tgz `find . -mtime -30`

上个月修改的所有文件。

答案 7 :(得分:3)

我只需执行以下操作即可备份7天前的所有新文件

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

请注意,您也可以用适合您需要的任何内容替换'7天前'

可以是:date -d'yesterday' +"%d-%b"

甚至:date -d'first Sunday last month' +"%d-%b"

答案 8 :(得分:2)

此脚本将查找在给定日期之前和之后具有两分钟修改日期的文件(您可以根据您的要求更改条件中的值)

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

例如,您希望文件仅在指定日期之前具有修改日期,您可以在120参数中将0更改为$DIFF_IN_DATE,同时放弃$DIFF_IN_DATE1参数的条件。< / p>

同样,如果您希望文件在给定日期之前和之后1小时具有修改日期, 只需将120替换为3600中的if CONDITION