• linux命令(6/10):find 命令


    Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,

    而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的“Standard BIOS Feture”项中进行设置。

    Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。

    可以考虑在时间同步脚本里面加入如下命令来同步硬件时间与软件时钟:

    hwclock --systohc (与系统时间同步)

    vmstat、常见问题处理

    如果r经常大于4,且id经常少于40,表示cpu的负荷很重。

    如果pi,po长期不等于0,表示内存不足。

    如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。

    1.)如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。

    2.)如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。

    3.)如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us)系统则面临着CPU资源的短缺。

    解决办法:

    当发生以上问题的时候请先调整应用程序对CPU的占用情况.使得应用程序能够更有效的使用CPU.同时可以考虑增加更多的CPU.  关于CPU的使用情况还可以结合mpstat,  ps aux top  prstat –a等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间.一般情况下,应用程序的问题会比较大一些.比如一些sql语句不合理等等都会造成这样的现象.

    内存问题现象:

    内存的瓶颈是由scan rate (sr)来决定的.scan rate是通过每秒的始终算法来进行页扫描的.如果scan rate(sr)连续的大于每秒200页则表示可能存在内存缺陷.同样的如果page项中的pi和po这两栏表示每秒页面的调入的页数和每秒调出的页数.如果该值经常为非零值,也有可能存在内存的瓶颈,当然,如果个别的时候不为0的话,属于正常的页面调度这个是虚拟内存的主要原理.

    解决办法: 
    1.调节applications & servers使得对内存和cache的使用更加有效.

    2.增加系统的内存.

    3. Implement priority paging in s in pre solaris 8 versions by adding line "set priority paging=1" in /etc/system. Remove this line if upgrading from Solaris 7 to 8 & retaining old /etc/system file.

    关于内存的使用情况还可以结ps aux top  prstat –a等等一些相应的命令来综合考虑关于具体的内存的使用情况,和那些进程在占用大量的内存.一般情况下,如果内存的占用率比较高,但是,CPU的占用很低的时候,可以考虑是有很多的应用程序占用了内存没有释放,但是,并没有占用CPU时间,可以考虑应用程序,对于未占用CPU时间和一些后台的程序,释放内存的占用。

    Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大

    3.命令参数:

    pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 

    -print: find命令将匹配的文件输出到标准输出。 

    -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } ;,注意{   }和;之间的空格。 

    -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

    4.命令选项:

    -name   按照文件名查找文件。

    -perm   按照文件权限来查找文件。

    -prune  使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

    -user   按照文件属主来查找文件。

    -group  按照文件所属的组来查找文件。

    -mtime -n +n  按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。

    -nogroup  查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

    -nouser   查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。

    -newer file1 ! file2  查找更改时间比文件file1新但比文件file2旧的文件。

    -type  查找某一类型的文件,诸如:

    b - 块设备文件。

    d - 目录。

    c - 字符设备文件。

    p - 管道文件。

    l - 符号链接文件。

    f - 普通文件。

    -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

    -fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

    -mount:在查找文件时不跨越文件系统mount点。

    -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

    -cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

    另外,下面三个的区别:

    -amin n   查找系统中最后N分钟访问的文件

    -atime n  查找系统中最后n*24小时访问的文件

    -cmin n   查找系统中最后N分钟被改变文件状态的文件

    -ctime n  查找系统中最后n*24小时被改变文件状态的文件

    -mmin n   查找系统中最后N分钟被改变文件数据的文件

    -mtime n  查找系统中最后n*24小时被改变文件数据的文件

    5.使用实例:

    查找文件
    find ./ -type f

    查找目录
    find ./ -type d

    查找名字为test的文件或目录
    find ./ -name test

    查找名字符合正则表达式的文件,注意前面的‘.*’(查找到的文件带有目录)
    find ./ -regex .*so.*.gz

    查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
    find ./ -type d -print -exec ls {} ;

    查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)
    find ./ -type d -ok ls {} ;

    查找目录并列出目录下的文件(将找到的目录添加到ls命令后一次执行,参数过长时会分多次执行)
    find ./ -type d -exec ls {} +

    查找文件名匹配*.c的文件
    find ./ -name *.c

    打印test文件名后,打印test文件的内容
    find ./ -name test -print -exec cat {} ;

    不打印test文件名,只打印test文件的内容
    find ./ -name test -exec cat {} ;

    查找文件更新日时在距现在时刻二天以内的文件
    find ./ -mtime -2

    查找文件更新日时在距现在时刻二天以上的文件
    find ./ -mtime +2

    查找文件更新日时在距现在时刻一天以上二天以内的文件
    find ./ -mtime 2

    查找文件更新日时在距现在时刻二分以内的文件
    find ./ -mmin -2

    查找文件更新日时在距现在时刻二分以上的文件
    find ./ -mmin +2

    查找文件更新日时在距现在时刻一分以上二分以内的文件
    find ./ -mmin 2

    查找文件更新时间比文件abc的内容更新时间新的文件
    find ./ -newer abc

    查找文件访问时间比文件abc的内容更新时间新的文件
    find ./ -anewer abc

    查找空文件或空目录
    find ./ -empty

    查找空文件并删除
    find ./ -empty -type f -print -delete

    查找权限为644的文件或目录(需完全符合)
    find ./ -perm 664

    查找用户/组权限为读写,其他用户权限为读(其他权限不限)的文件或目录
    find ./ -perm -664

    查找用户有写权限或者组用户有写权限的文件或目录
    find ./ -perm /220
    find ./ -perm /u+w,g+w
    find ./ -perm /u=w,g=w

    查找所有者权限有读权限的目录或文件
    find ./ -perm -u=r

    查找用户组权限有读权限的目录或文件
    find ./ -perm -g=r

    查找其它用户权限有读权限的目录或文件
    find ./ -perm -o=r

    查找所有者为lzj的文件或目录
    find ./ -user lzj

    查找组名为gname的文件或目录
    find ./ -group gname

    查找文件的用户ID不存在的文件
    find ./ -nouser

    查找文件的组ID不存在的文件
    find ./ -nogroup

    查找有执行权限但没有可读权限的文件
    find ./ -executable ! -readable

    查找文件size小于10个字节的文件或目录
    find ./ -size -10c

    查找文件size等于10个字节的文件或目录
    find ./ -size 10c

    查找文件size大于10个字节的文件或目录
    find ./ -size +10c

    查找文件size小于10k的文件或目录
    find ./ -size -10k

    查找文件size小于10M的文件或目录
    find ./ -size -10M

    查找文件size小于10G的文件或目录
    find ./ -size -10G

    exec解释:

    -exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

    {}   花括号代表前面find查找出来的文件名。

    使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

    实例1:ls -l命令放在find命令的-exec选项中 

    命令:find . -type f -exec ls -l {} ;

    输出: [root@localhost test]# find . -type f -exec ls -l {} ; 

    -rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log

    实例4:-exec中使用grep命令

    命令:find /etc -name "passwd*" -exec grep "root" {} ;

    输出:[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} ;

    root:x:0:0:root:/root:/bin/bash

    root:x:0:0:root:/root:/bin/bash

    [root@localhost test]#

    说明:任何形式的命令都可以在-exec选项中使用。  在上面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。

      实例5:查找文件移动到指定目录  

    命令:find . -name "*.log" -exec mv {} .. ;

    实例6:用exec选项执行cp命令  

    命令:find . -name "*.log" -exec cp {} test3 ;

    输出:

    [root@localhost test]# find . -name "*.log" -exec cp {} test3 ;

    cp: “./test3/log2014.log” 及 “test3/log2014.log” 为同一文件

    在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

    之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如:

    这个命令是错误的
    find /sbin -perm +700 |ls -l

    这样才是正确的
    find /sbin -perm +700 |xargs ls -l   
    xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能就会误判了,如果需要处理特殊字符,需要使用-0参数进行处理。

    实例1: 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件 

    命令:find . -type f -print | xargs file

    实例2:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中

    命令: find / -name "core" -print | xargs echo "" >/tmp/core.log

    实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限

    命令:find . -perm -7 -print | xargs chmod o-w

    实例4:用grep命令在所有的普通文件中搜索hostname这个词

    命令:find . -type f -print | xargs grep "hostname"

    实例5:用grep命令在当前目录下的所有普通文件中搜索hostnames这个词

    命令:

    find . -name * -type f -print | xargs grep "hostnames"

    说明:注意,在上面的例子中, 用来取消find命令中的*在shell中的特殊含义。  

     实例6:使用xargs执行mv 

    命令:find . -name "*.log" | xargs -i mv {} test4

    实例7:find后执行xargs提示xargs: argument line too long解决方法:

    命令:

    find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

    输出:[root@pd test4]#  find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

    说明:

    -l1是一次处理一个;-t是处理之前打印出命令

     实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[] 

    命令:

    [root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..

    说明:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[] 

     实例9:xargs的-p参数的使用 

    命令:find . -name "*.log" | xargs -p -i mv {} ..

      

    1.使用name选项:

    文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。  可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。  不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。

    find ~ -name "*.log" -print  

    想要在当前目录及子目录中查找所有的‘ *.log‘文件,可以用: 

    find . -name "*.log" -print  

    想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:  

    find . -name "[A-Z]*" -print  

    想要在/etc目录中查找文件名以host开头的文件,可以用:  

    find /etc -name "host*" -print  

    想要查找$HOME目录中的文件,可以用:  

    find ~ -name "*" -print 或find . -print  

    要想让系统高负荷运行,就从根目录开始查找所有的文件。  

    find / -name "*" -print  

    如果想在当前目录查找文件名以一个个小写字母开头,最后是4到9加上.log结束的文件:  

    命令:

    find . -name "[a-z]*[4-9].log" -print

    2.用perm选项:

    按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。  

    如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:  

    [root@localhost test]# find . -perm 755 -print

    .还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-005相当于555,

    命令:

    find . -perm -005 

    3.忽略某个目录:

    如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。如果希望在test目录下查找文件,但不希望在test/test3目录下查找,可以用:  

    命令:find test -path "test/test3" -prune -o -print

    4.使用find查找文件的时候怎么避开某个文件目录: 

    实例1:在test 目录下查找不在test4子目录之内的所有文件

    命令:

    find test -path "test/test4" -prune -o -print

    实例2:避开多个文件夹:

    命令:

    find test ( -path test/test4 -o -path test/test3 ) -prune -o -print  

    说明:

    圆括号表示表达式的结合。   表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。  

    实例3:查找某一确定文件,-name等选项加在-o 之后

    命令:

    find test (-path test/test4 -o -path test/test3 ) -prune -o -name "*.log" -print

    5.使用user和nouser选项:

    按文件属主查找文件:

    实例1:在$HOME目录中查找文件属主为peida的文件 

    命令:find ~ -user peida -print  

    实例2:在/etc目录下查找文件属主为peida的文件: 

    命令:find /etc -user peida -print  

    说明:实例3:为了查找属主帐户已经被删除的文件,可以使用-nouser选项。在/home目录下查找所有的这类文件

    命令:find /home -nouser -print

    说明:这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。

    6.使用group和nogroup选项:

    就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:  

    find /apps -group gem -print  

    要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件:

    find / -nogroup-print

    7.按照更改时间或访问时间等查找文件:

    如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。  

    用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。  

    希望在系统根目录下查找更改时间在5日以内的文件,可以用:

    find / -mtime -5 -print

    为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:

    find /var/adm -mtime +3 -print

    8.查找比某个文件新或旧的文件:

    如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。

    它的一般形式为:  

    newest_file_name ! oldest_file_name  

    其中,!是逻辑非符号。  

    实例1:查找更改时间比文件log2012.log新但比文件log2017.log旧的文件

    命令:

    find -newer log2012.log ! -newer log2017.log

    9.使用type选项:

    实例1:在/etc目录下查找所有的目录  

    命令:find /etc -type d -print  

    实例2:在当前目录下查找除目录以外的所有类型的文件  

    命令:find . ! -type d -print  

    实例3:在/etc目录下查找所有的符号链接文件

    命令:find /etc -type l -print

     10.使用size选项:

    可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。  

    在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。  

    实例1:在当前目录下查找文件长度大于1 M字节的文件  

    命令:find . -size +1000000c -print

    实例2:在/home/apache目录下查找文件长度恰好为100字节的文件:  

    命令:find /home/apache -size 100c -print  

    实例3:在当前目录下查找长度超过10块的文件(一块等于512字节) 

    命令:find . -size +10 -print

     11.使用depth选项:

    在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。  

    实例1:find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。   

    命令:find / -name "CON.FILE" -depth -print

    说明:它将首先匹配所有的文件然后再进入子目录中查找

    12.使用mount选项: 

      在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。

    实例1:从当前目录开始查找位于本文件系统中文件名以XC结尾的文件  

    命令:find . -name "*.XC" -mount -print 

  • 相关阅读:
    C#托盘图标
    线程相关整理
    Quartz.NET 快速入门
    (转)IE内存泄露,iframe内存泄露造成的原因和解决方案
    美化console.log的文本(转载)
    mongoDB学习资料整理
    EF7学习资料整理
    Oracle常用
    Node.js学习资料整理
    【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器(转)
  • 原文地址:https://www.cnblogs.com/klb561/p/9162660.html
Copyright © 2020-2023  润新知