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


136

我宁愿不要在PHP中执行此操作,因此希望有一个精通Shell脚本的人可以提供帮助。

我需要一个递归遍历目录的脚本,该脚本查找上次修改日期大于某个日期的所有文件。然后,它将压缩并压缩保留路径信息的文件。


14
最好不要在PHP中执行此操作。
克雷登斯2009年

1
您可以使用任何合适的Shell脚本语言,例如python,ruby,perl,而无需使用php。
garrow

3
@garrow在PHP中,使用包含在FilterIterator中的RecursiveDirctoryIterator实际上非常简单。
Artefacto

Answers:


136

就像:

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

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

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

4
有关如何处理文件名中的空格,请参阅下面user104848的答案
Brian Henk

8
将任意时间戳转换为分数相对时间量似乎既不正确也不特别方便。下面使用该解决方案-newermt漂亮。
鲍比·杰克

5
尝试提取具有目录结构的更改的任何文件时,目录本身被标记为已修改,从而导致整个文件夹被归档。添加-type f到仅选择文件。这将维护文件夹结构,但仅备份更改后的文件。
布伦特

1
@BrianHenk user104848改变了他们的名字,我敢肯定你的意思是从(目前)贾森·路德这个答案虽然
icc97

4
该问题要求在任意日期之前找到文件。答案是如何查找过去任意天数的文件。我认为如果不添加将日期转换为日期增量的步骤,这应该不是公认的答案。
2016年

91

如果您有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确保即使用户中断它也会被删除的方法,依此类推。


65
相反,您可以使用它-newermt '2009-01-03T12:31:43'来避免创建仅用于参考的文件。
Michael Mior 2012年

@MichaelMior:有趣-MacOS X 10.7.2支持“查找” -newermt(在文档中记录,-newerXY因为有多个选项;在这种情况下,X = m,Y = t)。我使用的(几乎是过时的)Linux系统上的GNU查找不支持该选项,因此它是相对较新的版本。感谢您的注意。
乔纳森·莱夫勒

我在系统上使用的GNU find 4.4.2中提供了此选项。
Michael Mior 2012年

2
还要注意,GNU find也支持相对时间,即。-newermt '-2 weeks'
Cybolic

1
-newermt '2009-01-03T12:31:43'看起来很棒,但可悲的是它似乎可以解释错误时区中的所有内容:lists.gnu.org/archive/html/bug-findutils/2012-12/msg00009.html
antoine

35

您可以直接使用tar甚至更好地执行此操作:

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

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


9
嗯...自1984年以来我就一直在使用Unix,但从不知道这一点。总是要学习的东西。
约翰,

tarOS X和FreeBSD附带的实现只支持GNU中--newer的长选项。-Ntar
nisetama

太棒了...我只能让它与bzip一起使用,而不是使用-xcvf和gz扩展名...但是我不是专家。
菲尔

17

这将适用于一定数量的文件。您希望包括“ -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压缩。


1
关于第二点,您也可以使用启用了gzip的tar命令(例如Gnu tar的-z选项)来更新压缩的存档。
Suncat2000 2011年

或添加'j'选项以在最近的GNU tar中使用bzip
hd1 2013年

3
正如我在乔纳森(Jonathan)的回答中所说的那样,这将抓住具有更改的文件夹,从而导致其所有文件都被导入。添加-type f到仅选择文件。这将维护文件夹结构,但仅备份最近更改/添加的文件。
布伦特

12

这应该显示最近7天内修改的所有文件。

find . -type f -mtime -7 -print

用管道将其插入tar / zip,您应该会很好。


3

在Linux下很好尝试阅读find命令的手册页

man find

这样的事情应该

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

而你有


3

您可以使用以下日期获得最近修改的文件列表:

find . -mtime -x

然后,您只需将tar文件和zip文件压缩到结果列表中,例如:

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

上个月修改的所有文件。


3
“ -mtime x”与完全在“ x”天之前修改的文件匹配,请使用“ -mtime -x”来匹配在“ x”天之前修改的文件。
兰斯·理查森

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"


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

例如,您只希望文件的修改日期早于给定日期,则可以更改1200in $DIFF_IN_DATE参数以放弃参数的条件$DIFF_IN_DATE1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.