今天有一道面试题:“在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了。

wKiom1PD1CazYCWqAAGsTZ7Gsc0949.jpg

ll /tmp/log/

wKiom1PD1IfDd3qbAAGbQA62WEQ263.jpg

言归正传,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