天天一個linux命令:find

一、命令簡介

        find(find) 命令用來在指定目錄下查找文件。任何位於參數以前的字符串都將被視爲欲查找的目錄名。若是使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。而且將查找到的子目錄和文件所有進行顯示。 php

二、用法

image

三、選項

'-H'表示只跟隨命令行中指定的符號鏈接,
'-L'表示跟隨全部的符號鏈接,
'-P'是默認的選項,表示不跟隨符號鏈接。
-D debugoptions. 打印診斷信息
-Olevel  Enables  query  optimisation.   容許查詢優化

EXPRESSIONS:表達式可能由下列成份組成:操做符、選項、測試表達式以及動做:java

一、操做符爲and、or、!的組合。mysql

! expr True if expr is false.        
-not expr   Same as ! expr, but not POSIX compliant.
expr1 expr2  implied "and"; expr2 is not evaluated if expr1 is false.
expr1 -a expr2  Same as expr1 expr2.
expr1 -and expr2 Same as expr1 expr2, but not POSIX compliant.
expr1 -o expr2  Or; expr2 is not evaluated if expr1 is true.
expr1 -or expr2  Same as expr1 -o expr2, but not POSIX compliant.
expr1 , expr2 List; both expr1 and expr2 are always evaluated.  The  value  of expr1 is discarded; the value of the list is the value of expr2.The comma operator can be useful for searching for several  different  types  of thing, but traversing the filesystem hierarchy only once.  The -fprintf action can be used to list the  various matched items into several different output files.

二、設置項針對此次查找任務,而不是僅僅針對某一個文件,設置項老是返回true;web

位置選項 (老是真): -daystart -follow -regextype
普通選項 (老是真,在其它表達式前指定):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race

三、測試項(test)則不一樣,它針對具體的一個文件進行匹配測試,如-name,-user等,返回true或者false;正則表達式

測試項sql

-name  -type  -ok  -newer -perm  -atime, -ctime, -depth, -group,  -links,  -mtime,-nogroup,  -nouser,  -print,  -prune,  -size,  -user  and  -xdev -atime,  -ctime,  -depth,  -group,  -links,  -mtime,-nogroup,  -nouser,  -perm,  -print,  -prune, -size,-user and –xdev

測試項說明shell

-name   filename             #查找名爲filename的文件
-perm                        #按執行權限來查找
-user    username             #按文件屬主來查找
-group groupname            #按組來查找
-mtime   -n +n                #按文件更改時間來查找文件,-n指n天之內,+n指n天之前
-atime    -n +n               #按文件訪問時間來查GIN: 0px">
-ctime    -n +n              #按文件建立時間來查找文件,-n指n天之內,+n指n天之前
-nogroup                     #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser                     #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天之內,+n指n天之前 
-ctime    -n +n               #按文件建立時間來查找文件,-n指n天之內,+n指n天之前 
-nogroup                     #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser                      #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2               #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f         #查是塊設備、目錄、字符設備、管道、符號連接、普通文件
-size      n[c]               #查長度爲n塊[或n字節]的文件
-depth                       #使查找在進入子目錄前先行查找完本目錄
-fstype                     #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f         #查是塊設備、目錄、字符設備、管道、符號連接、普通文件
-size      n[c]               #查長度爲n塊[或n字節]的文件
-depth                       #使查找在進入子目錄前先行查找完本目錄
-fstype                      #查位於某一類型文件系統中的文件,這些文件系統類型一般可 在/etc/fstab中找到
-mount                       #查文件時不跨越文件系統mount點
-follow                      #若是遇到符號連接文件,就跟蹤連接所指的文件
-cpio                %;      #查位於某一類型文件系統中的文件,這些文件系統類型一般可 在/etc/fstab中找到
-mount                       #查文件時不跨越文件系統mount點
-follow                      #若是遇到符號連接文件,就跟蹤連接所指的文件
-cpio                        #對匹配的文件使用cpio命令,將他們備份到磁帶設備中
-prune                       #忽略某個目錄

四、動做項(action)則是對某一個文件進行某種動做(最多見的如-print)安全

actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print 
      -fprint0 FILE -fprint FILE -ls -fls FILE -prune – -quit
      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
  1. -print: find命令將匹配的文件輸出到標準輸出。
  2. -ls:使用ls -dils 格式將匹配的文件輸出到標準輸出。
  3. -exec: find命令對匹配的文件執行該參數所給出的shell命令。
  4. -ok: 和-exec的做用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每個命令以前,都會給出提示,讓用戶來肯定是否執行。

四、示例

實例1:-H –L –P指定對符號鏈接的處理方式oracle

[root@oracledb dir1]# ln -s /bin  rootbin
[root@oracledb dir1]# find -P . -name pwd
[root@oracledb dir1]# find -L . -name pwd
./rootbin/pwd
[root@oracledb dir1]# find -H rootbin  . -name pwd
rootbin/pwd

示例2:根據文件名或者正則表達式進行匹配性能

列出當前目錄及子目錄下全部文件和文件夾

[root@zabbix alertscripts]# find
.
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

在當前目錄下查找以.py結尾的文件名

[root@zabbix alertscripts]# find . -name "*.py"
./sendim.py
./sendmail.py
./sendwechat.py

在當前目錄下查找以.py結尾的文件名 ,但忽略大小寫

[root@zabbix alertscripts]# find . -iname "*.PY"
./sendim.py
./sendmail.py
./sendwechat.py

當前目錄及子目錄下查找全部以.py和.sh結尾的文件

[root@zabbix alertscripts]#  find . -name "*.py" -o -name "*.sh"
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

找出當前目錄下不是以.sh結尾的文件

[root@zabbix alertscripts]# find . ! -name "*.sh"
.
./sendim.py
./sendmail.py
./sendwechat.py

示例3:匹配文件路徑或者文件

find /usr/ -path "*local*"

示例4:基於正則表達式匹配文件路徑

[root@zabbix alertscripts]#  find . -regex ".*\(\.sh\|\.py\)$"
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

同上,但忽略大小寫

[root@zabbix alertscripts]#  find . -iregex ".*\(\.SH\|\.PY\)$"
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

示例5:搜索但跳出指定的目錄

查找當前目錄或者子目錄下全部文件,可是跳過子目錄alertscripts

[root@zabbix zabbix]# find .  -path "./alertscripts" -prune  -o -name "*.*"
.
./web/maintenance.inc.php
./web/zabbix.conf.php
./zabbix_java_gateway.conf
./zabbix_agentd.d
./zabbix_agentd.d/userparameter_mysql.conf
./zabbix_agentd.conf
./alertscripts
./zabbix_java_gateway_logback.xml
./zabbix_server.conf.rpmnew_bak
./zabbix_server.conf_bak
./zabbix_server.conf

示例6:根據文件類型進行搜索

(f 普通文件 l 符號鏈接 d 目錄 c 字符設備 b 塊設備 s 套接字 p Fifo )

[root@zabbix alertscripts]# find . -type d
.

示例7:基於目錄深度搜索 向下最大深度限制爲1

[root@zabbix zabbix]# find . -maxdepth 1
.
./web
./zabbix_java_gateway.conf
./zabbix_agentd.d
./zabbix_agentd.conf
./alertscripts
./zabbix_java_gateway_logback.xml
./zabbix_server.conf.rpmnew_bak
./zabbix_server.conf_bak
./zabbix_server.conf

搜索出深度距離當前目錄至少2個子目錄的全部文件

find . -mindepth 2 

示例8:根據文件時間戳進行搜索

find . -type f 時間戳

UNIX/Linux文件系統每一個文件都有三種時間戳:

訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。

修改時間(-mtime/天,-mmin/分鐘):文件最後一次修改時間。

變化時間(-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最後一次修改時間。

搜索最近七天內被訪問過的全部文件

find . -type f -atime –7

搜索剛好在七天前被訪問過的全部文件

find . -type f -atime 7

搜索超過七天內被訪問過的全部文件

find . -type f -atime +7

搜索訪問時間超過10分鐘的全部文件

find . -type f -amin +10

找出比file.log修改時間更長的全部文件

find . -type f -newer file.log

示例9:根據文件大小進行匹配 

搜索大於10KB的文件

find . -type f -size +10k

搜索小於10KB的文件

find . -type f -size –10k

搜索等於10KB的文件

find . -type f -size 10k

示例10:根據文件權限/全部權進行匹配

當前目錄下搜索出權限爲777的文件

find . -type f -perm 777

找出當前目錄下權限不是644的php文件

find . -type f -name "*.php" ! -perm 644

示例11:根據用戶/用戶組進行匹配

找出當前目錄用戶zabbix擁有的全部文件

find . -type f -user zabbix

找出當前目錄用戶組zabbix擁有的全部文件

find . -type f -group zabbix

示例12:–delete 刪除匹配文件

刪除當前目錄下全部.txt文件

find . -type f -name "*.txt" –delete

示例13:列出匹配文件 :

find . -type f -name "*.txt" –ls

五、藉助-exec選項與其餘命令結合使用

find是咱們很經常使用的一個Linux命令,可是咱們通常查找出來的並不只僅是看看而已,還會有進一步的操做,這個時候exec的做用就顯現出來了。exec選項後面跟隨着所要執行的命令或腳本,而後是一對兒{ },一個空格和一個\,最後是一個分號。

-exec  參數後面跟的是command命令,它的終止是以;爲結束標誌的,因此這句命令後面的分號是不可缺乏的,考慮到各個系統中分號會有不一樣的意義,因此前面加反斜槓。{}   花括號表明前面find查找出來的文件名。

找出當前目錄下全部root的文件,並把全部權更改成用戶oracle

find .-type f -user root -exec chown oracle {} \;

查找當前目錄下全部.txt文件並把他們拼接起來寫入到all.txt文件中

find . -type f -name "*.txt" -exec cat {} \;> all.txt

將30天前的.log文件移動到old目錄中

find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

找出當前目錄下全部.txt文件並以「File:文件名」的形式打印出來

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

由於單行命令中-exec參數中沒法使用多個命令,如下方法能夠實如今-exec以後接受多條命令

-exec ./text.sh {} \;

六、find的ok操做

-ok和-exec行爲同樣,不過它會給出提示,讓用戶決定是否執行相應的操做。

找出本身家目錄下全部的.txt文件並刪除

[root@oracledb ~]# find $HOME/. -name "*.txt" -ok rm -f {} \;
< rm ... /root/./log1.txt > ? y
< rm ... /root/./study/dir2/test.txt > ? y
< rm ... /root/./log.txt > ? y
[root@oracledb ~]#

七、find與xargs

在使用find命令的-exec選項處理匹配到的文件時, find命令將全部匹配到的文件一塊兒傳遞給exec執行。但有些系統對可以傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘以後,就會出現溢出錯誤。錯誤信息一般是「參數列太長」或「參數列溢出」。這就是xargs命令的用處所在,特別是與find命令一塊兒使用。

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是所有,不像-exec選項那樣。這樣它能夠先處理最早獲取的一部分文件,而後是下一批,並如此繼續下去

在有些系統中,使用-exec選項會爲處理每個匹配到的文件而發起一個相應的進程,並不是將匹配到的文件所有做爲參數一次執行;這樣在有些狀況下就會出現進程過多,系統性能降低的問題,於是效率不高;而使用xargs命令則只有一個進程。另外,在使用xargs命令時,到底是一次獲取全部的參數,仍是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來肯定。

來看看xargs命令是如何同find命令一塊兒使用的,並給出一些例子。

查找系統中的每個普通文件,而後使用xargs命令來測試它們分別屬於哪類文件

find . -type f -print | xargs file

在整個系統中查找內存信息轉儲文件(core dump) ,而後把結果保存到/tmp/core.log 文件中:

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

用grep命令在全部的普通文件中搜索hostname這個詞

find . -type f -print | xargs grep "hostname"

刪除3天之前的全部東西

find . -ctime +3 -exec rm -rf {} \;
find ./ -mtime +3 -print|xargs rm -f –r

刪除文件大小爲零的文件

find ./ -size 0 | xargs rm -f &

find命令配合使用exec和xargs可使用戶對所匹配到的文件執行幾乎全部的命令。

相關文章
相關標籤/搜索