欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux-shell脚本获取24小时内被修改的文件

程序员文章站 2022-05-14 21:26:19
...

 

一、错误代码(谨慎运行)


场景描述:本人想要查看在24小时内被修改和操作过的文件,并且将这些文件加上accessed后缀之后存储到指定的文件夹中。

第一次写shell脚本如下,该脚本是找到修改过的文件,然后直接将原文件重命名,在原来的文件上面加上.accessed后缀。然后将修改后的文件转存到指定文件夹。

shell脚本如下所示:

for file in $(find ./ -type f -atime -1) #寻找文件
do
 mv ${file} ${file}.accessed  #加后缀
 mv ${file}.accessed /home/shell_study/accessed/   #转存到指定文件夹
done

注意:这个代码不要随便执行,如果你修改了linux系统文件,它也会转存到指定文件夹,会导致linux系统坏掉,对于小白来说不易修复

二、完善后的代码(较安全) 


下面附上完善后的代码,这段shell脚本的逻辑是:找到修改后的文件,将其复制到指定文件夹并重命名,

for file in $(find ./ -type f -atime -1)
do
 cp ${file} /home/shell_study/accessed/${file}.accessed
done

对于该段脚本,较安全,找到修改过的 文件之后,通过find -name "*文件名*" 查找该文件地址,进行操作,更方便。

注意在shell脚本中不能写成-name,因为Unix文件名通常不包含斜杠(尽管路径名包含斜杠)。这意味着'-name`./test16.sh''在这个系统上可能一直计算为false。

for file in $(find ./ -type f -atime -1)
do
 cp ${file} /home/shell_study/accessed/${file}.accessed
 find -name "${file}"
done
~     

执行上面的代码报错

find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-name `./test16.sh'' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful, or perhaps '-samefile'.  Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ `./test16.sh''.
cp: cannot create regular file `/home/shell_study/accessed/./accessed/test16.sh.accessed.accessed': No such file or directory

提示:您可能会发现'-wholename'测试更有用,或者可能是'-samefile'。所以我们将代码find -name "${file}" 修改为find -wholename "${file}",如下所示:

for file in $(find ./ -type f -atime -1)
do
 cp ${file} /home/shell_study/accessed/${file}.accessed
 find -wholename "${file}"
done

执行该脚本显示如下:

[[email protected] shell_study]# sh test16.sh 
./test16.sh
./test003.sh
[[email protected] shell_study]# 

./test16.sh
./test003.sh都是当前文件夹下修改的文件。