我宁愿不在PHP中这样做,所以我希望有一个体面的shell脚本可以提供帮助。
我需要一个以递归方式运行目录的脚本,并查找上次修改日期的所有文件都大于某个日期。然后,它将tar和zip文件保留路径信息。
答案 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
。