我需要根据年份移动文件。我使用了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