【问题标题】:Shell Script — Get all files modified after <date>Shell 脚本 — 获取在 <date> 之后修改的所有文件
【发布时间】:2010-10-25 07:11:42
【问题描述】:

我不想在 PHP 中执行此操作,所以我希望一个擅长 shell 脚本的人可以提供帮助。

我需要一个脚本,它以递归方式遍历目录并找到所有文件的最后修改日期大于某个日期。然后,它将 tar 和 zip 保存路径信息的文件。

【问题讨论】:

  • 不使用 PHP 的好决定。
  • 你可以使用任何不错的 shell 脚本语言,例如 python、ruby、perl,而无需求助于 php。
  • @garrow 这在 PHP 中使用封装在 FilterIterator 中的 RecursiveDirctoryIterator 实际上相当简单。

标签: unix shell


【解决方案1】:

就这么简单:

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

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

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

【讨论】:

  • 查看下面 user104848 的回答,了解如何处理文件名中的空格
  • 将任意时间戳转换为分数的相对时间量似乎既不正确也不特别方便。下面使用-newermt 的解决方案好多更好。
  • 当试图提取目录结构中发生更改的任何文件时,目录本身会被标记为已修改,从而导致整个文件夹被归档。添加-type f 以仅选择文件。这会维护文件夹结构,但仅备份有更改的文件。
  • @BrianHenk user104848 改了名字,不过我很确定你的意思是this answer from (currently) Jason Luther
  • 该问题要求按任意日期查找文件。这个答案是如何在过去的任意天数内查找文件。如果不添加将日期转换为日期增量的步骤,我认为这不应该是公认的答案。
【解决方案2】:

如果您有 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 以确保即使用户中断它也会被删除,等等。

【讨论】:

  • 相反,您可以使用-newermt '2009-01-03T12:31:43' 来避免创建仅供参考的文件。
  • @MichaelMior:有趣 - MacOS X 10.7.2 上的“查找”支持-newermt(记录在-newerXY 下,因为有多个选项;在这种情况下,X = m,Y = t) .在我使用的(几乎是过时的)Linux 系统上找到的 GNU 不支持这些选项,因此它是一个相对较新的版本。感谢您的提醒。
  • 此选项存在于我在我的系统上使用的 GNU find 4.4.2 中。
  • 另请注意,GNU find 也支持相对时间,即。 -newermt '-2 weeks'.
  • -newermt '2009-01-03T12:31:43' 看起来很棒,但遗憾的是它似乎在错误的时区解释了所有内容:lists.gnu.org/archive/html/bug-findutils/2012-12/msg00009.html
【解决方案3】:

你可以直接用 tar 做这件事,甚至更好:

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

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

【讨论】:

  • 嗯...我从 1984 年就开始使用 Unix,但从来不知道这一点。总有东西要学。
  • OS X 和 FreeBSD 附带的tar 的实现只支持--newer,这是GNU tar-N 的长选项。
  • 这太棒了......我只能让它与 bzip 一起工作,而不是使用 -xcvf 和 gz 扩展......但我不是专家。
【解决方案4】:

这适用于一些文件。您希望包含“-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 压缩。

【讨论】:

  • 关于第二点,您也可以使用启用 gzip 的 tar 命令(如 Gnu tar 的 -z 选项)来更新压缩档案。
  • 或者添加 'j' 选项以在最近的 GNU tars 中使用 bzip
  • 正如我在上面乔纳森的回答中所说的那样,这将抓取发生更改导致其所有文件被导入的文件夹。添加-type f 以仅选择文件。这会维护文件夹结构,但仅备份最近更改/添加的文件。
【解决方案5】:

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

find . -type f -mtime -7 -print

将它导入 tar/zip,你应该会很好。

【讨论】:

    【解决方案6】:

    我只需执行以下操作即可备份 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"

    【讨论】:

      【解决方案7】:

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

      man find
      

      应该是这样的

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

      你有它

      【讨论】:

        【解决方案8】:

        您可以使用以下命令获取最后一次修改的文件列表,该列表晚于 x 天前:

        find . -mtime -x
        

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

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

        上个月修改的所有文件。

        【讨论】:

        • "-mtime x" 匹配恰好在 "x" 天前修改的文件,使用 "-mtime -x" 匹配不到 "x" 天前修改的文件。
        【解决方案9】:

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

        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
        

        例如,您希望文件的修改日期仅在给定日期之前,您可以将$DIFF_IN_DATE 参数中的120 更改为0,放弃$DIFF_IN_DATE1 参数的条件。

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

        【讨论】:

          猜你喜欢
          • 2020-09-12
          • 1970-01-01
          • 1970-01-01
          • 2013-11-03
          • 1970-01-01
          • 2018-03-22
          • 1970-01-01
          • 2022-06-10
          • 2011-03-28
          相关资源
          最近更新 更多