Linux下find命令的用法
一、find簡介
? ?find命令是linux系統下一個強大的文件查找命令,它可以根據你所指定的文件大小、權限,屬主、屬組、修改時間、訪問時間等條件查到你想要得到的東西。
? ?談到find,有人可能就會與grep命令糾結一會兒,grep命令主要是文本內容查找,在文件范圍內找符合條件的文本;而find命令則是在系統范圍內找符合條件的文件,它不關心文件的內容,只關心文件是否存在。所以,find是針對文件的而grep是針對文本內容的。grep另一種用法就是使用管道命令來接收前一個命令的輸出來做為自己的輸入,這則是用來匹配字符串的。
二、find命令語法結構
? ?find [查找路徑] [查找條件] [處理動作]
? ?查找路徑:默認為當前目錄
? ?查找條件:默認為查找指定路徑下的所有文件
? ?處理動作:默認為顯示
從find命令的語法結構也可以看出,它的幾個選項都是可選的,如果不選的話,則會列出當前目錄下的所有文件。
三、find命令功能使用
1)查找條件
? -name 文件名稱,支持使用globbing文件通配。
? -inme,查找時不區分大小寫。
? ? ? *,?,[],[^],\(\)(轉義)
? ? ? 例:查找/usr/local下所有包含httpd的文件
? ? ? 全用-iname選項后,就會忽略大小寫,并且find會遞歸整個查找路徑下的目錄和文件。
? -user UserName:根據屬主查找
? -group UserName:根據屬組查找
? -nouser:查找沒有屬主的文件
? -nogroup:查找沒有屬組的文件
? ? ? 例:找出/usr/local下屬主是nmshuishui的文件
? -uid UID:根據指定的UID查找
? -gid GID: 根據指定的GID查找
? ? ? ?既然有了根據用戶名查找,為什么還要來一個UID和GID呢?如果你刪除了一個賬戶,但是沒有使用-r選項,因此你刪除的賬戶是沒有完全刪干凈的。
? ? ? ?例:查找/usr/local下屬于UID508的所有文件
2)組合條件
? ?-a:與,and,同時滿足。多個條件與時,-a可省略
? ?-o:或,or
? ?-not,!:非,取反
? ?例:找出/usr/local下屬主是nmshuishui且屬組是root的文件
? ?例:找出/usr/local/httpd下不屬于root或vbird的所有文件
? ?上題所說的不屬于root或vird實際上是指既不屬于root又不屬于vbird的所有文件,邏輯問題,自己理解。
3)-type
? ?根據文件類型查找
? ? f:普通文件 ? ?d:目錄 ? ?b:塊設備 ? c:字符設備 ? l:符號鏈接文件 ? p:命令管道 ? s:套接字
? ?例:查找/usr/local下屬主是nmshuishui的目錄。
4)-size
? 根據文件大小查找
? ? ?-size [+|-]#
? ? ?常用單位:K,M,G
? 這里的size就是中國移動的做法了,通話沒有一分鐘就是一分鐘了。如果-seze 1M,就代表是大于0M大而小于1M的,-size -1M就代表是0M到0M以下的,那-size +1M就是1M以上的了,有點不符合常理。
? 例:找出/etc/下大于1M且文件類型為普通文件的所有文件
5)根據時間戳查找
? ? ?以天為單位(time)
? ? ? ? ?-atime[+|-]:access,訪問時間 ? ? ? ? ? ? ? ?〡 +:表示(#+1)天之外被訪問過
? ? ? ? ?-mtime:modify,修改時間 ? ? ? ? ? ? ? ? ? →〡 -:表示(#)天之內被訪問過
? ? ? ? ?-ctime:create,改變時間 ? ? ? ? ? ? ? ? ? ?〡無:表示 # --(#+1)天的時間段被訪問過
? ? ?以分鐘為單位(min)
? ? ? ? ?-amin[+|]
? ? ? ? ?-mmin
? ? ? ? ?-cmin
? ?如上圖,-2天其實就是2天之內的,2天就是2天到3天的,+2天就是3天之外的,這回應該更好理解點兒了吧。
? ?例:查找當前系統上沒有屬主或屬組,且最近1個月內曾被訪問過的文件。
6)根據權限查找
? ? -perm [+|-]mode
? ? ? ? ? mode:精確匹配 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?無符號,精確匹配
? ? ? ? ?+mode:滿足任何一類用戶的任何一位權限即可 ? ? ? +號,或關系,范圍大
? ? ? ? ?-mode:每類用戶的任何一位都需匹配 ? ? ? ? ? ? ? -號,且關系,范圍小
? ? ? ? ?說明:+mode:常用于查找某類用戶的某特定權限是否存在
? ? 例:查找/etc目錄下所有用戶都沒有寫權限的文件
? ? ? ? ? ? 所有都沒有,相反:任何一個有
? ? ? ? ? ? 所有都有,相反:至少有一個沒有
? ? 例:查找/usr/local/share/目錄下至少有一類用戶沒有寫權限(都有,取反:到少一個沒有)
? ? 例:查找/usr/local/目錄下,所有用戶都有執行權限且其它用戶有寫權限的文件
? ? ? ?find /usr/local -perm -111 -a -perm -002 ?= ?find /usr/local -perm -113
四、處理動作,默認為-print
? ?-print:打印在標準輸出上
? ?-l:以長格式輸出各文件信息
? ?find /tmp -perm -006 -ls ? ls是處理動作
? ?-exec COMMAND {} \;
對查找到的文件執行指定的命令({}表示占位符,表示接收來自前面的find命令所查找到的文件,并對那個文件執行相應操作.)
?|xargs COMMAND
五、-exec與|xargs COMMAND對比
find把查找到的所有文件一次性傳遞給-exec所指定的命令,如果同時傳遞的文件過多,由于參數過多,會導致命令溢出,所以為了避免這種情況發生,我們還需要使用find |xargs COMMAND 這個命令,因為這個命令是把前面命令所執行的結果當作后面命令的參數使用的,xargs是一批批接受命令,所以不會由于傳遞參數過多而導致溢出的結果.
既然這樣,是不是我們再也不需要使用find 后面跟\;這種機制了?還要-exec干什么?因為還有一種情況是xargs所搞不定的,那就是我們要給一類文件進行統一改名.
mv `find /tmp -iname "*.doc" ? XXX(*.docx?),像下例中,你使用mv能統一改嗎?目標怎么命令啊?難道要來一個*.docx嗎?*是什么啊?看來還是沒法搞定,這樣,我們的那個-exec中的{}占位符就派上用場了,前面怎么占位,后面就怎么輸出,統一改名so easy。
find /tmp -perm -664 -type f -exec chmodo+x {} \; 把前面找到的文件放到{}中,進行統一權限修改
find /tmp -perm -664 -type f |xargs chmodo+x 相當于把前面找到的文件通過管道輸出給xargs作為參數,再進行統一權限修改
轉載于:https://blog.51cto.com/xiaoxiaoniao/1399590
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Linux下find命令的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Ubuntu 使用PPPoe拨号上网
- 下一篇: 当鼠标移动到图片上会显示 不同的背景