前言java
Linux的基本特性之一就是一切皆文件,在系統管理過程當中不免會遇到須要查找各類類型文件的問題,那麼如何準備快速的查找定位呢,本文將對Linux系統中文件查找工具及用法進行詳解;linux
常見工具對比nginx
常見的文件查找工具主要有locate(非實時查找)和find(實時查找)。locate查找依賴於索引,而索引構建至關暫用資源,索引的建立是在系統空閒時由系統自動進行(天天任務),手動建立可使用updatedb命令,查找速度快但結果非精確,即爲模糊查找。而find相對於locate而言,是遍歷全部文件進行條件匹配,查找速度慢可是結果精確,即爲精準查找。簡而言之,對於實際生產環境,find(實時查找)無心更加高效。shell
常見查找類命令bash
名稱:whereisapp
功能:定位文件所在目錄
ssh
用法:whereis shell命令
ide
注意:whereis是根據環境變量PATH來查找文件的,而PATH一般設置成存放命令的那些路徑,如/bin、/sbin、/usr/bin等。所以whereis的用途僅限於定位shell命令所在的位置。 svn
[root@mail ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
名稱:locate工具
功能:locate 文件名或者目錄名
說明:locate默認是不被安裝的,它的包名叫:mlocate能夠直接使用yum安裝便可。locate也是系統中經常使用查找文件的方法,可是它並非直接從磁盤實時查找文件,而是由updatedb命令所產生的信息庫中查找相應的文件和目錄。
注意:若是locate找不到某個命令,可是又肯定該文件存在時,是因爲updatedb生成的信息庫已通過期,此時你只須要以root的身份執行updatedb命令,從新創建整個系統全部文件和目錄的資料庫。可是updatedb命令比較暫用資源,通常不建議手動更新。
find命令的用法
命令格式:
find [options] [查找路徑] [查找條件] [處理動做]
查找路徑:默認爲當前路徑
查找條件:默認爲指定目錄下的因此文件
處理動做:默認爲顯示至屏幕
條件查找
-name "文件名稱":支持使用globbing字符 *:任意長度任意字符 ?:任意單個字符 []:範圍內任意字符 [^]:範圍外任意字符 -iname "文件名稱":查找時忽略字符大小寫 -user USERNAME: 根據文件的屬主查找 -group GRPNAME: 根據文件的屬組查找 -uid UID:根據用戶UID查找 -gid GID:根據用戶GID查找 -nouser: 查找沒有屬主的文件 -nogroup: 查找沒有屬組的文件
組合條件查找
-a:與,同時知足 -o:或,知足一個便可 -not:!非,條件取反
文件類型查找
-type TYPE:根據文件類型查找 f:普通文件 d:目錄文件 l:符號連接 b:塊設備 c:字符設備 s:套接字文件 p:命名管道 -size [+|-]#UNIT:根據文件大小查找 經常使用單位:k,M,G #UNIT:#-1<x<=# -#UNIT:x<=#-1 +#UNIT:x># (x爲匹配到的文件大小)
時間戳查找
以「天」爲單位 -atime(訪問時間) [+|-]# +#:x>=#+1 -#:x<# #:#<=x<#+1 (x爲匹配到的文件時間) -mtime(修改時間) -ctime(改變時間) 以「分鐘」爲單位 -atime -mtime -ctime (用法同上)
權限查找
-perm [+|-]MODE MODE:與MODE精確匹配 +MODE: 任何一類用戶的權限只要能包含對其指定的任何一位權限便可 -MODE:每類用戶指定的檢查權限都匹配
處理動做
-print: 默認處理動做,顯示 -ls:相似於ls -l -exec COMMAND {} \; -ok COMMAND {} \; #find一次性查找符合條件的全部文件,並一同傳遞 給-exec或-ok後面指定的命令,但有些命令不能接受過長的參數,此時使用另外一種方式: find | xargs COMMAND
find實戰
一、查找/etc/init.d/目錄中包含e並已s結尾的文件並複製到/tmp下 [root@mail ~]# ls /etc/init.d/ auditd ip6tables mdmonitor network ntpdate rsyslog sshd crond iptables messagebus nginx postfix sandbox svnserve functions kdump netconsole nginx-debug rdisc saslauthd udev-post halt killall netfs ntpd restorecond single [root@mail ~]# find /etc/init.d/ -name "*e*s" -exec cp {} /tmp \; [root@mail ~]# ls /tmp ip6tables iptables messagebus netfs 二、查找/var/目錄屬主爲root且屬組爲mail的因此文件 [root@mail ~]# find /var/ -user root -group mail /var/spool/mail /var/spool/mail/root 三、查找/usr/目錄下不屬於root、bin或bjwf的全部文件 [root@mail ~]# find /usr/ -not \( -user root -o -user bin -o -user bjwf \) /usr/local/nginx /usr/local/nginx/sbin /usr/local/nginx/sbin/nginx 四、查找/tmp目錄下最近7天內修改過且不屬於root和bjwf的文件並顯示屬性信息 [root@mail ~]# find /tmp -mtime -7 -not \( -user root -o -user bjwf \) -ls 262152 0 -rw-r--r-- 1 nginx nginx 0 5月 23 14:58 /tmp/sum.sh 五、查找當前系統上沒有屬主或屬組,且最近1個月內曾被訪問過的文件 [root@mail ~]# find / \( -nouser -o -nogroup \) -a -atime -30 六、查找/etc/目錄下大於1M且類型爲普通文件的全部文件 [root@mail ~]# find /etc/ -type f -size +1M /etc/pki/tls/certs/ca-bundle.trust.crt /etc/selinux/targeted/modules/active/policy.kern /etc/selinux/targeted/policy/policy.24 七、查找/etc/目錄全部用戶都沒有寫權限的文件 [root@mail ~]# find /etc/ -not -perm +222 /etc/openldap/certs/password /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt /etc/pki/ca-trust/extracted/java/cacerts /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem /etc/ld.so.conf.d/kernel-2.6.32-573.el6.x86_64.conf /etc/shadow /etc/gshadow /etc/shadow- /etc/sudoers 八、查找/etc/目錄下至少有一類用戶沒有寫權限 [root@mail ~]# find /etc/ -not -perm -222 > /tmp/perm [root@mail ~]# wc -l /tmp/perm #文件太多,因此追加到/tmp/perm下 1019 /tmp/perm 九、查找/etc/rc.d/目錄下,全部用戶都有執行權限且其它用戶有寫權限的文件 [root@mail ~]# find /etc/rc.d -perm -113 > /tmp/perm.113 [root@mail ~]# wc -l /tmp/perm.113 163 /tmp/perm.113 十、在/apps/audit目錄下查找全部用戶具備讀、寫和執行權限的文件,並收回相應的寫權限 # find /apps/audit -perm -7 -print | xargs chmod o-w