今天有一道面试题:“在var/log下查找3天前的日志文件,并且文件名称以.log结尾的日志文件,删除之”。然后回来测试一下该题的实现。
首先我把/var/log下的日志复制到/tmp下测试:
cp -r /var/log/ /tmp;使用cp命令后一个一个文件提示确认复制(之前拷贝过一次),输入N个Y过后终于把日志文件复制到/tmp目录下了。使用ls -al /tmp/log/后发现日志的mtime都是执行cp命令时的时间。看到直接晕菜了,那么多个Y白输了。
原来cp命令不加任何参数时文件的修改时间(mtime)不会拷贝过来, 加-p 或 --preserve 选项后才会保留源文件或目录的属性。另外,-i是互动选项,我没加-i选项它也提示我,为什么?使用命令"alias cp"发现cp是个别名,cp='cp -i'。要使用原命令只要在cp前加''\''即可,如\cp -pvr /var/log/ /tmp/。
下面把cp命令及其常用option列出来供大家参考:
-a archive,归档处理,此参数的效果和同时指定"-dpR"参数相同
-i interactive 覆盖文件之前先询问用户
-r recursive,递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理。
-f 强行复制文件或目录, 不论目的文件或目录是否已经存在
-p 保留源文件或目录的属性,包括所有者、所属组、权限与时间
-u 使用这项参数之后,只会在源文件的修改时间(Modification Time)较目的文件更新时,或是名称相互对应的目的文件并不存在,才复制文件
-s 对源文件建立符号链接,而非复制文件
-l 对源文件建立硬链接,而非复制文件
rm -rf /tmp/log/,删除log文件重来一次,使用命令"\cp -pvr /var/log/ /tmp/",再去ll一下,OK了。
ll /tmp/log/
言归正传,find命令使用如下:
a、以文件文件和文件属性查找
- name "字串" 查找文件名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。
-group "字串" 查找属于用户组名为所给字串的所有的文件。
-user "字串" 查找属于用户名为所给字串的所有的文件。 -gid n 查找属于ID号为n的用户组的所有文件。 -uid n 查找属于ID号为n的用户的所有文件。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。 -nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。 -newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
b、以文件大小和权限查找
-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。
-size n[bckw] 查找指定文件大小的文件,n后面的字符表示单位,缺省为b,代表512字节的块
c、以文件时间戳来查找
- amin n 查找n分钟以前被访问过的所有文件。
- atime n 查找n天以前被访问过的所有文件。 - cmin n 查找n分钟以前文件状态被修改过的所有文件。 - ctime n 查找n天以前文件状态被修改过的所有文件。 - mmin n 查找n分钟以前文件内容被修改过的所有文件。 - mtime n 查找n天以前文件内容被修改过的所有文件。
d、找到所要删除的文件
a、查询3天的日志文件:find /tmp/log -mtime +3
b、查询以.log结尾的日志文件:find /tmp/log -name *.log
c、查询3天前以.log结尾的日志:find /tmp/log -mtime +3 -a -name *.log
#选项-a表示“与”同时满足两个条件,-o表示“或”条件,!表示非
e、执行操作
- exec COMMAND option{} \;对符合条件的文件执行所给的 命令,{}表示命令的参数即为所找到的文件,命令的末尾必须以“ \;”结束,"{}"和"\;"之间必须有一个空格。
|xargs COMMAND option;对符合条件的文件执行所给的命令.
删除查找出的文件:find /tmp/log -mtime +3 -a -name *.log -exec rm -rf {} \;
或find /tmp/log -mtime +3 -a -name *.log | xargs rm -rf