如何根据年份移动文件

如何根据年份移动文件

我需要根据年份移动文件。我使用了find命令

find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6

但为了成功执行这个命令,我需要知道确切的数字,mtime现在 470 只是一个猜测。意味着如果我可以给出 2012 年,它只会给我与 2012 年相关的文件。

所以我需要关于如何做的建议

查找基于年份(例如 2012 年)的文件并将它们移动到其他目录。

OS release 5.2

FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 

答案1

您想要使用该-newermt选项find

find /media/WD/backup/osool/olddata/ -newermt 20120101 -not -newermt 20130101

获取修改时间在2012年的所有文件。

如果您的发现不支持,-newermt您还可以执行以下操作来防止使用偏移计算:

touch -d 20120101 /var/tmp/2012.ref
touch -d 20130101 /var/tmp/2013.ref
find /media/WD/backup/osool/olddata/ -newer /var/tmp/2012.ref -not -newer /var/tmp/2013.ref

联机帮助页

-newerXY reference
          Compares the timestamp of the current file with reference.   The
          reference  argument  is  normally the name of a file (and one of
          its timestamps is used for the comparison) but it may also be  a
          string  describing  an  absolute time.  X and Y are placeholders
          for other letters, and these letters select which time belonging
          to how reference is used for the comparison.

          ...

          m   The modification time of the file reference
          t   reference is interpreted directly as a time

答案2

touch --date=2011-12-31T23:59:59 start
touch --date=2012-12-31T23:59:59 stop
find / -newer start \! -newer stop -printf %Tx" "%p\\n

-exec ls没有任何意义。

答案3

根据手册页, -mtime 的参数是您要查找的天数。您可以用来date +%j查找自今年 1 月 1 日以来的天数。

答案4

如果您从工作目录执行此操作,则可以执行以下操作:

ls -l |awk '{ if ($8 == "2013") print $9 }'

这大大简化了事情并且不会导致任何重叠。但它还假设这些文件的历史超过 6 个月,并且ls将打印年份而不是确切时间。

对于 6 个月以上的文件,您只需将其替换为:

ls -l |awk '{ if ($6 == "May") print $9 }' 

或类似的东西,具体取决于月份。如果您想创建移动文件的月份列表(或者如果您想创建多年列表),请执行以下操作:

month="May Jun Jul"; 
for i in `echo $month`; 
do 
    for j in `ls -l |awk '{ if ($6 == "'$i'") print $9}'`
    do
        mkdir -p $i
        mv $j $i
    done
done

相关内容