zoukankan      html  css  js  c++  java
  • 【Linux】Linux查找功能

         linux系统中我们经常会需要查找某些文件,当有时候我们不确定一个文件的位置,比如某服务配置文件具体路径,自己没有头绪去寻找的话会很难找,也会耽误时间。linux就提供了很多命令,find,locate,which,whereis等。下面就详细介绍这些命令并使用。

     find命令


     find命令是linux中最常见的查找文件的命令,功能很强大,它是用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

       语法:

              find (选项) (参数)  [filename]

       

    示例:

    搜索当前目录(包含子目录下所有文件和文件夹)。

    [root@localhost /]# find .

    搜索某个目录下的所有子目录和文件。

    [root@localhost /]# find /home   这里会把home下所有子目录文件都显示出来

    搜索某个目录下的某个文件,这里加上参数-name 就是代表搜索文件名称。

    [root@localhost /]# find /home  -name "123.txt"
    /home/test123/abc/123.txt

    对搜索目录的深度限制,-maxdepth参数是对搜索深度的设置

    [root@localhost /]# find . -maxdepth 1   1就是搜索一层 
    .
    ./boot
    ./dev
    ./home
    ./proc
    ./run
    ./sys
    ./etc
    ./root
    ./tmp

    对文件类型的搜索,参数type  

    [root@localhost /]# find . -maxdepth 1 -type f      f代表搜索文件
    ./.autorelabel
    ./appendonly.aof
    ./dump.rdb
    [root@localhost /]# find . -maxdepth 1 -type d      d代表搜索的是目录
    .
    ./boot
    ./dev
    ./home
    ./proc

    上面搜索出来的文件目录都仅仅只显示名字,想看到详细信息

    [root@localhost /]# find . -maxdepth 1 -type f -exec ls -lh {} ;
    -rw-r--r-- 1 root root 0 6月  28 2017 ./.autorelabel
    -rw-r--r-- 1 root root 30M 9月  14 2017 ./appendonly.aof
    -rw-r--r-- 1 root root 4.5K 9月  14 2017 ./dump.rdb

    按照文件或目录的权限搜索。需要 find命令中 perm 参数。使用方法可以参考这篇 https://blog.csdn.net/lidonghat/article/details/66478071

    [root@localhost /]# find . -maxdepth 1 -type d -perm -755  -exec ls -dhl  {} ;  按权限搜索当前目录中的目录
    drwxr-xr-x 20 root root 3.3K 5月   6 13:02 ./dev
    drwxr-xr-x. 9 root root 87 5月   5 11:34 ./home
    drwxr-xr-x 35 root root 1020 5月   6 13:08 ./run
    drwxr-xr-x. 145 root root 8.0K 5月   6 13:03 ./etc
    drwxrwxrwt. 28 root root 8.0K 5月   6 15:55 ./tmp
    drwxr-xr-x. 24 root root 4.0K 5月   6 13:02 ./var
    drwxr-xr-x. 13 root root 4.0K 6月  27 2017 ./usr
    drwxr-xr-x. 2 root root 6 6月  10 2014 ./media
    drwxrwxrwx. 4 root root 27 12月 15 17:25 ./mnt
    drwxr-xr-x. 14 root root 4.0K 10月 13 2017 ./opt
    drwxr-xr-x. 2 root root 6 6月  10 2014 ./srv
    [root@localhost /]# find . -maxdepth 1 -type f -perm 644  -exec ls -hl  {} ;  按权限搜索当前目录中的文件
    -rw-r--r-- 1 root root 0 6月  28 2017 ./.autorelabel
    -rw-r--r-- 1 root root 30M 9月  14 2017 ./appendonly.aof
    -rw-r--r-- 1 root root 4.5K 9月  14 2017 ./dump.rdb

     找到当前目录下权限不是644的文件,-perm参数前面加了一个感叹号,取反

    [root@localhost /]# find . -maxdepth 1 -type f ! -perm  644  -exec ls -hl  {} ;
    -rwxr-xr-x 1 root root 0 5月   6 16:06 ./zzz

    模糊搜索文件后缀包含.bash的文件

    [root@localhost /]# find /home  -name "*.bash*"
    /home/xyy/.bash_logout
    /home/xyy/.bash_profile
    /home/xyy/.bashrc
    /home/xyy/.bash_history
    /home/mysql/.bash_logout

     模糊搜索文件后缀不包含.bash的文件

    [root@localhost /]# find /home ! -name "*.bash*"

    搜索当前目录属于root用户的文件

    [root@localhost /]# find . -maxdepth 1 -type f -user root  -exec ls -hl  {} ;
    -rw-r--r-- 1 root root 0 6月  28 2017 ./.autorelabel
    -rw-r--r-- 1 root root 30M 9月  14 2017 ./appendonly.aof
    -rw-r--r-- 1 root root 4.5K 9月  14 2017 ./dump.rdb
    -rwxr-xr-x 1 root root 0 5月   6 16:06 ./zzz

     搜索文件大小大于300m的文件

    [root@localhost ~]# find / -type f -size +300M
    /proc/kcore
    find: ‘/proc/6258/task/6258/fdinfo/6’: 没有那个文件或目录
    find: ‘/proc/6258/fdinfo/6’: 没有那个文件或目录
    /usr/local/mysql/lib/libmysqld.a
    /usr/local/mysql/bin/mysqld

    命令执行结果中有一些提示信息,这些信息不需要显示,可以去除。

    [root@localhost ~]# find / -type f -size +300M 2>/dev/null
    /proc/kcore
    /usr/local/mysql/lib/libmysqld.a
    /usr/local/mysql/bin/mysqld
    /usr/local/mysql/bin/mysql_embedded
    /usr/local/mysql/bin/mysqltest_embedded
    /usr/local/mysql/bin/mysql_client_test_embedded

    知道每个文件具体大小,后面加上使用du命令统计下。

    [root@localhost ~]# find / -type f -size +300M 2>/dev/null | xargs du -sh
    0       /proc/kcore
    928M    /usr/local/mysql/lib/libmysqld.a
    350M    /usr/local/mysql/bin/mysqld
    330M    /usr/local/mysql/bin/mysql_embedded
    329M    /usr/local/mysql/bin/mysqltest_embedded
    331M    /usr/local/mysql/bin/mysql_client_test_embedded
    396M    /usr/local/mysql/data/oa_workflow/OPERATION_LOGS.ibd
    713M    /usr/local/mysql/data/db_kingnet_oa/t_message.ibd

    对结果的文件大小排序。

    [root@localhost ~]# find / -type f -size +300M 2>/dev/null | xargs du -sh | sort -nr
    928M    /usr/local/mysql/lib/libmysqld.a
    928M    /opt/mysql-8.0.0-dmr/libmysqld/libmysqld.a
    713M    /usr/local/mysql/data/db_kingnet_oa/t_message.ibd
    665M    /opt/mysql-8.0.0-dmr/sql/libsql.a
    643M    /opt/mysql-8.0.0-dmr/libmysqld/libsql_embedded.a
    488M    /usr/local/mysql/data/oa_2018/operation_logs.ibd
    396M    /usr/local/mysql/data/oa_workflow/OPERATION_LOGS.ibd
    364M    /usr/local/mysql/data/oa_workflow_test/OPERATION_LOGS.ibd
    350M    /usr/local/mysql/bin/mysqld
    350M    /opt/mysql-8.0.0-dmr/sql/mysqld

    计算当前目录中文件md5的值并保存在文件中

    [root@localhost oa]# find . -type f | xargs  md5sum  > md5.txt
    [root@localhost oa]# cat md5.txt
    cfa55387ce15a2fb9060dd448d88538f  ./time.sh
    f107df99a0e3d3f3a1bb6abaa549e5d8  ./a.txt
    707cce2673010a0d0191c4a2d2440580  ./.a.txt.swp
    37c218cf1dcb7cdb3a483eb7b8244246  ./passwd
    d41d8cd98f00b204e9800998ecf8427e  ./b.txt
    98828b6f94757a6bdfdeb0ff6decaa7d  ./md5.txt

    结合-exec和xargs 选项来搜索出来find出来的结果。(xargs与管道的区别是:管道是将前面命令的标准输出作为后面的标准输入,而xargs是实现“将标准输入作为命令的参数”

    exec后面跟着要执行的命令。

    [root@localhost oa]# ll
    总用量 16
    -rw-r--r-- 1 root root   26 5月   6 16:25 a.txt
    -rw-r--r-- 1 root root    0 5月   6 13:38 b.txt
    -rw-r--r-- 1 root root  262 5月   6 18:08 md5.txt
    -rw-r--r-- 1 root root 2581 5月   4 13:47 passwd
    -rw-r--r-- 1 root root   30 4月  27 22:51 time.sh
    [root@localhost oa]# find . -type f -exec chmod 777 {} ;      将搜索出来的文件权限改成777, 使用exec参数后面要固定跟上 {} ;
    [root@localhost oa]# ll
    总用量 16
    -rwxrwxrwx 1 root root   26 5月   6 16:25 a.txt
    -rwxrwxrwx 1 root root    0 5月   6 13:38 b.txt
    -rwxrwxrwx 1 root root  262 5月   6 18:08 md5.txt
    -rwxrwxrwx 1 root root 2581 5月   4 13:47 passwd
    -rwxrwxrwx 1 root root   30 4月  27 22:51 time.sh

    还有个参数和exec功能一样,只不过每个具体执行的过程会提示是否同意。

    [root@localhost oa]# find . -type f -ok chmod 777 {} ;
    < chmod ... ./time.sh > ? y
    < chmod ... ./a.txt > ? y
    < chmod ... ./.a.txt.swp > ? y
    < chmod ... ./passwd > ? y
    < chmod ... ./b.txt > ? y
    < chmod ... ./md5.txt > ? y

    用xargs显示出每个文件的信息。

    [root@localhost oa]# find . -type f | xargs stat
      文件:"./time.sh"
      大小:30              块:8          IO 块:4096   普通文件
    设备:fd00h/64768d      Inode:1176906     硬链接:1
    权限:(0777/-rwxrwxrwx)  Uid:(    0/    root)   Gid:(    0/    root)
    最近访问:2018-05-06 18:07:52.548866071 +0800
    最近更改:2018-04-27 22:51:34.869883350 +0800
    最近改动:2018-05-06 20:53:43.855914501 +0800
    创建时间:-
      文件:"./a.txt"
      大小:26              块:8          IO 块:4096   普通文件
    设备:fd00h/64768d      Inode:1176944     硬链接:1
    权限:(0777/-rwxrwxrwx)  Uid:(    0/    root)   Gid:(    0/    root)
    最近访问:2018-05-06 16:25:33.041110933 +0800
    最近更改:2018-05-06 16:25:29.743048457 +0800
    最近改动:2018-05-06 20:53:43.858914559 +0800
    ........

     找出 / 目录下以 .ini结尾的文件,并进行文件分类

    [root@localhost pcntl]# find / -name *.ini -type f -print | xargs file
    /etc/php.d/curl.ini:                                                              ASCII text
    /etc/php.d/posix.ini:                                                             ASCII text
    /etc/php.d/phar.ini:                                                              ASCII text
    /etc/php.d/zip.ini:                                                               ASCII text
    /etc/php.d/sysvsem.ini:                                                           ASCII text
    /etc/php.d/sysvshm.ini:                                                           ASCII text
    /etc/php.d/json.ini:                                                              ASCII text
    /etc/php.d/sysvmsg.ini:                                                           ASCII text
    /etc/php.d/fileinfo.ini:                                                          ASCII text
    /etc/php.ini:                                                                     ASCII English text
    /opt/baletu/jdk1.8.0_51/lib/missioncontrol/configuration/config.ini:              ASCII text
    /opt/baletu/jdk1.8.0_51/bin/jmc.ini:                                              ASCII text
    /alidata/www/baletoo/Issue/conf/application.ini:                                  ASCII text, with CRLF line terminators
    /alidata/www/baletoo/m/YafMobile/conf/application.ini:                            ASCII text, with CRLF line terminators
    /alidata/www/baletoo/YafPc/conf/application.ini:                                  ASCII text, with CRLF line terminators

    find功能还有很多,这里暂时就介绍这么多。

      

    whereis命令


     whereis命令用来搜索出二进制程序、源代码文件和man手册页等相关文件的路径。它的搜索内容比较局限,只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

    示例:

    [root@localhost oa]# whereis mysql
    mysql: /usr/lib64/mysql /usr/local/mysql /usr/share/mysql /usr/local/mysql/bin/mysql

    搜索二进制文件

    [root@localhost oa]# whereis -b ls
    ls: /usr/bin/ls

      

     which命令


     which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。which是根据使用者所配置的$PATH 变量内的目录去搜寻可运行档的!所以不同的$PATH 配置内容所找到的内容不一样。

    示例:

    [root@localhost oa]# which php
    /usr/local/php7/bin/php

    locate命令


    locate命令用来查找文件或目录,它和find功能差不多,只不过比find命令块很多,因为find是在系统中每个目录搜索,而locate是搜索linux中的一个数据库。

    示例:

    [root@localhost tmp]# locate nginx.conf
    /opt/nginx-1.12.0/conf/nginx.conf
    /usr/local/nginx/conf/.nginx.conf.swp
    /usr/local/nginx/conf/nginx.conf
    /usr/local/nginx/conf/nginx.conf.def
    [root@localhost tmp]# touch nginx.conf
    [root@localhost tmp]# locate nginx.conf
    /opt/nginx-1.12.0/conf/nginx.conf
    /usr/local/nginx/conf/.nginx.conf.swp
    /usr/local/nginx/conf/nginx.conf
    /usr/local/nginx/conf/nginx.conf.default
    /var/lib/pcp/pmdas/nginx/nginx.conf

        locate这个命令不是搜索整个文件系统,而是搜索一个数据库,所以搜索速度很快。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令手动更新数据库。

    -v:显示执行的详细过程
    [root@localhost ~]# touch song.php
    [root@localhost ~]# locate song.php
    /root/song.php

    在tmp目录下不行

  • 相关阅读:
    计算机概念-shell
    数组去重复的三种方法
    CSS 自定义字体
    解决 IE 6/7 中console对象兼容性问题
    Sublime Text 3 Install Markdown Preview Plugins
    对象数组排序函数
    Ubuntu 16.04 下使用Xampp
    JavaScript 中 申明变量的方式--let 语句
    bootstrap框架 导航条组件使用
    phpstorm version 2016.2 License Server激活
  • 原文地址:https://www.cnblogs.com/songgj/p/8996020.html
Copyright © 2011-2022 走看看