Linux学习笔记——find命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习笔记——find命令相关的知识,希望对你有一定的参考价值。

哎呀,随着年龄的增大记性越来越差了之前学过的一些命令也就依稀记得写命令名字了(大写的监介,你懂得),趁着年前还有点时间就先把find命令简单整理一下吧,其实都知道葫芦里卖的什么药(手动哈哈)!

有人可能会说了记得名字其他不就好办了吗,直接命令行真男人(man)一下就可以拯救世界了,话虽如此,谁让本人只对女人感兴趣咧~,不扯了开始正题。

先看下find用法格式:

    find   [path...] [expression]

常用选项

    -name:指明要查询的文件名;

    -type :指明所要查询的文件类型;

        (1) l :符号文件。

        (2) f:普通文件。

        (3) d:目录文件。

        (4) p:管道文件。

        (5) c:字符设备文件,提供连续的数据流,读取数据按照先后顺序,通常不支持随机存取,比如键盘、鼠标、串口。

        (6) b:块设备文件,从设备的任意位置读取一定长度的设备,也就是可以随机存取,比如硬盘、U盘、SD卡。

        (7) socket:套接字文件。

    -amin [+|-] time:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;

    -mtime [+|-] time:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;

技术分享

    图片来源于网络

          示例1:查询24小时内被修改过的文件,通过使用-mtime 0 即可完成操作,现在时间是2017.01.13 21:00,那0就表示从当前时间到2017.01.12 21:00这个时间之内被修改过的文件;

          示例2:查询2天内/etc目录下被修改过的文件;

            ~]# find /etc -mtime -2     #是指01.11那天到01.13中间的时间,但是其实并不包含11日那天。

          示例3:查询2天前修/etc目录被修改过的文件; 

 ~]# find /etc -mtime +2     #与【-】号正相反从01.11号开始算,并包含11号当天。

    -size [+|-] 文件大小:查找指定文件大小的文件;

    -perm [+|-]文件权限:找符合指定的权限数值的文件或目录;

        +:表示的是或的意思,比方说查找具有4755权限的文件,那如果文件权限为644也会被查询出来,因为4755中也包含了644。

         -:表示的是与的意思,即属主属组和其他这三者的权限全部符合指定条件才会被选定。

      -newer <参考文件或目录名>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;

      -maxdepth <目录层级>:这个在特定情况下也会用到,表示如果目录是多层嵌套的,那设定此值就是最大查询到的目录层数。

       -nouser:查找没有属主的文件或目录;

       -nogroup:查找没有属组的文件或目录;

       -user <用户名>:查找属主为指定用户的文件或目录;

       -group <组名>:查找属组为指定属组的文件或目录;

       -path <范本样式>:指定字符串作为寻找目录的条件;

       -prune :不寻找字符串作为寻找文件或目录的范本样式,此选项可以在查询的目录中选择一些不希望被查找的目录来忽略,通常跟-path搭配使用;

            示例:find /  -path "/proc" -prune

最后要说的一点就是find命令还有一个额外的功能,查找完指定条件的结果之后还可以通过exec参数来与其他命令组合使用来进行返回结果的处理。

示例:查找系统中没有属主和属组的文件,并将其进行删除操作;

~]# find / -path "/proc" -prune -o -nouser -nogroup  -exec rm -rf {} \;

====****我是分割线****========****我是分割线****====

后边的例题用到grep ,为了方便可以先将其创建一个别名便于使用

~]# alias grep=egrep --color=auto

1、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();

~]# grep "\<[_[:alpha:]]+\>\(\)" /etc/rc.d/init.d/functions

2、使用echo命令输出一个绝对路径,使用grep取出其基名;扩展:取出其路径名

(1) 取基名:

~]# echo "/etc/sysconfig/network-scripts/" |grep -o "[^/]+/?$"

(2) 取路径名:

这个题如果在最后的目录分割符没有的情况使用grep比较好取,但要是实现dirname命令的所取得的结果,目前我只能使用sed来完成,grep还不知道怎么写正则表达式比较好。

~]# echo "/etc/sysconfig/network-scripts/" |sed ‘[email protected]\(^/.*\)/\([^/]\+\)/\[email protected]\[email protected]

3、找出ifconfig命令结果中的1-255之间数字

(1)

~]# ifconfig |grep -o "[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"

(2) 扩展,找出内容之后进行格式化输出:

~]# ifconfig |grep -o "[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"|sort -n|awk ‘{dig[$1]++}END{for(i in dig){printf "The digit %d\t has appears %d times\n",i,dig[i]}}‘

4、查找当前系统上没有属主或属组的文件;进一步:查找当前系统上没有属主或属组,且最近3天内曾被访问过的文件或目录;

(1)没有属主或属组

~]# find / -nouser -nogroup

(2) 在条件一的基础上在查找3天内被访问过的文件或目录

~]# find / (-nouser -o -nogroup) -atime -3

5、查找/etc目录下大于1M,且类型为普通文件的所有文件;

~]# find /etc -size +1M -type f

6、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的文件;

~]# find /etc/init.d -perm -113 -exec ls -l {} \;

7、查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件;

~]# fine /etc -not \( -user root -o -user hadoop \) -mtime -7 -exec ls -l {} \;

8、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#;

~]# cp -r /etc/rc.d/rc.sysinit /tmp

方法一、使用vim进行编辑操作在命令模式下操作

~]# %[email protected]^[[:space:]]\[email protected]#@

还有一种是使用\s来替代空白字符

~]# %[email protected]^\s\[email protected]#@g

注此种方法是将查找到的内容替代成#号,如果是在符合条件的行前添加#号的话应该使用后向引用

~]# %[email protected]\(^\s\+\)@#\[email protected]

还有一种方法就是可以在不用打开文件的情况下完成以上操作

~]# sed -i -r ‘[email protected]^[[:space:]][email protected]#&@‘ /tmp/rc.sysinit

注意:此操作在生产环境中尽量先测试一下再将文件中的内容替换掉,以防后悔!

9、删除/tmp/rc.sysinit文件中的以#开头,且后面跟了至少一个空白字符的行行的#和空白字符

同第8题

方法一、在vim命令模式下操作

~]# %[email protected]^#\s\[email protected]@g /tmp/rc.sysinit

方法二、使用sed编辑替换

~]# sed -i -r ‘[email protected]^#[[:space:]][email protected]@‘ /tmp/rc.sysinit

10、将/etc/yum.repos.d/CentOS-Media.repo文件中所有的enabled=0或gpgcheck=0的最后的0修改为1;

方法一、vim打开文件在命令模式全局替换

~]# %[email protected]\(enabled|gpgcheck\)\[email protected]\[email protected]

方法二、使用sed处理非常便捷,但是不熟练的话,还是先测试没问题之后再使用-i选项进行写入操作吧

~]# sed -r -i ‘[email protected]\(enabled|gpgcheck\)\[email protected]\[email protected]‘ /etc/yum.repos.d/CentOS-Media.repo

11、每周2,4,6备份/var/log/messages文件至/backup/messages_logs/目录中,保存的文件名形如messages-20161202

使用vim 编辑/etc/crontab文件

~]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  0  0  *  *  2,4,6  root dd if=/var/log/messages of=/backup/messages_logs/messages-`date +%Y%m%d`

12、每天每两小时取当前系统/proc/meminfo文件中的所有以S开头的信息至/stats/memory.txt文件中

使用vim 编辑/etc/crontab文件

~]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  0 */2  *  *  *  root  grep "^S.*" /proc/meminfo >>/tmp/memory.txt

13、写一个脚本创建10用户user10-user19;密码同用户名

~]# mkdir scripts
~]# vim addUser.sh
#!/bin/bash
#
#Program: Automatically create user scripts
#History:
#Author: Bing Version:0.0.1 2017-01-13 15:52
   for i in {1..9};do
       if ! `id user$i &>/dev/null`;then
           useradd user$i &>/dev/null && echo "user$i"|passwd --stdin user$i &>/dev/null && echo "user$i create success!"
       else
           userdel -r user$i &>/dev/null && echo "user$i delete success!"
       fi
   done



本文出自 “积小流,成江海” 博客,请务必保留此出处http://goodjoe.blog.51cto.com/9173556/1891905

以上是关于Linux学习笔记——find命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux中find命令学习笔记

linux 学习笔记—

Linux学习笔记4_基本文件操作命令复习2

Linux学习笔记4_基本文件操作命令复习2

Linux学习笔记(10)

Linux学习笔记find文件名后缀