文件查找
在linux系統中如果我們不知道具體的文件的具體位置,我們可以使用文件查找命令來找到我們想找的文件,linux中也有相當優秀的查找命令,(如locate、find),通常查找速度快是locate,因為它是利用數據庫查找的,所以速度很快,而find是全磁盤掃描進行查找,所以速度比較慢。
locate和find都是在文件系統上查找符合條件的文件含義。
區別:locate速度快,但如果新添加的文件需要更新其數據可才能找到,
find速度慢,但隨時可全面找到,功能比locate強大。
下面說一說具體用法~~~
locate(查找、定位)
依賴于事先構建好的索引庫;系統自動周期性的更新其數據庫
手動更新數據庫命令:updatedb
updatedb根據/etc/uodatedb.conf的設置去查看系統硬盤內的文件名,并更新/var/lib/mlocate內的數據庫文件
非實時查找(如果新創建的文件還沒有被數據庫更新到,那么就找不到此文件,必須為locate的數據可更新到其數據庫才能實現查找)
依賴于數據庫:/var/lib/mlocate/mlocate.db
locate工作特性:
非實時查找
查找速度快
進行模糊查找
把所有的字符或關鍵字匹配庫中的每一個路徑,路徑中的任何一個位置不光是文件名,但凡出現匹配的字符串都認為是符合條件的。
locate [option]… [PATTERN]…
-b:只匹配路徑中的基名
-c:統計出共有多少個符合條件的文件
-r:支持正則表達式
-i:執行區分大小的搜索
結論:locate功能不大,但查找速度很快
例:查找系統中所有與passwd相關的文件名
[root@CentOS 7 ~]# locate passwd
/etc/.passwd.swp
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
………下面省略………
find(發現找到)
實時查找工具,通過遍歷指定起始路徑下文件系統層級結構完成查找
工作特性:
查找速度略慢
精確查找
實時查找
用法: find [options ] [查找起始路徑] [查找條件] [處理動作]
查找起始路徑:指具體搜索目標的開始路徑,默認為當前目錄
查找條件:指定查找標準,可以根據文件名、大小、類型、從屬關系、權限等標準。默認為找出指定條件的所有文件
處理動作:對符合查找條件的文件進行額外的操作,例如刪除等操作,默認為輸出至標準輸出
查找起始路徑:
指定需要對那個目錄進行查找
例:查找/etc/sysconfig下所有以network開頭的文件
#find /etc/sysconfig -name "*network*" 其中/etc/sysconfig 就是要查找的路徑
查找條件:
根據文件名查找(注意:文件名必須加引號)
-name PATTERN : 查找文件名,可以使用glob風格的通配符來進行模糊查找
-iname PATTERN : 不區分大小寫的查找文件名,也可使用glob風格的通配符查找
glob風格的通配符
*、?、[ ] 、[ ^ ]
#find /etc/ -iname "passwd" //不區分大小寫的前提下在/etc/目錄下查找passwd文件
根據文件從屬關系
-user username :查找屬主為指定用戶的所有文件 -group groupname :查找屬組為指定組的所有文件 -nouser :查找沒有屬主的文件 -nogroup :查找沒有屬組的文件 -uid UID :查找指定的UID的所有文件 -gid GID: 查找指定GID的所有文件
根據文件類型查找
-type TYPE
TYPE:s:套接字文件、f:普通文件、L/h符號鏈接文件、c:字符設備文件、 d:目錄文件、b:塊設備文件、p:管道文件
組合測試:
與:-a 必須兩者滿足才行(默認組合的邏輯 )
#find /tmp -nouser -a -type f -ls 顯示/tmp目錄下沒有屬主并且為普通的文件的文件
或:-o 滿足一個條件即可
#find /tmp -nouser -o -type f -ls 顯示/tmp目錄下沒有屬主或者為普通的文件的文件
非:-not/! 條件取反
!A -a !B =! (A -o B) !A -o !B =! (A -a B)
根據文件的大小查找:
-size [+|-] n UNIT(單位)
常用單位:k/M/G
-size 10k :查找等于10k的文件(9k以上到10k以下之間的文件)
-size +10k: 查找大于10k的文件(不包括10k,10k以上)
-size -10k:查找小于10k的文件(包括10k及以下)
根據時間戳查找:
以天為單位:可使用n、+n、-n (n為數字)
-atime(access) -mtime(mtime) -ctime(ctime)
以分鐘為單位:可使用n、+n、-n(n為數字)
amin mmin cmin
下面以mtime來具體解釋一下
-mtime n :n為數字,意義為在n天之前的“一天之內”被更改過的文件
-mtime +n:在n天之前(不包含n天本身) 被更改過的文件名
-mtime -n:在n天之內(含n天本身)被更改過的文件名
圖中最右邊為當前時間,越往左邊則越代表越早之前的時間軸。由此可以知道:
+4代表大于等于5天前的文件名: find /var -mtime +4
-4代表小于等于4天內的文件名: find /var -mtime -4
4代表4~5那一天內的文件名:find /var -mtime 4
例:1、找出4天內被改動過的文件名
find /var -mtime -4
2、找出4天前的那一天被改動過的文件名
find /var -mtime 4
根據權限查找:
-perm [/|-] mode
-perm mode :精確權限匹配
#find / -perm 644 //查找根下權限為644的文件
-perm /mode :任何一類用戶(u、g、o)的權限中任何一位(r、w、x)符合條件就滿足
#find / -perm 666 //三類用戶中只要有一類用戶能滿足6(rw-)即可滿足
-perm -mode :每一類用戶(u、g、o)的權限中每一位(r、w、x)都必須符合條件就滿足
#find / -perm -222 //三類用戶中都必須擁有寫權限即可滿足
注意:權限為上如果使用如:-200 ,0則表示忽略相對應的用戶的權限檢查
處理動作:
-print:輸出至標準輸出,此為默認動作
-ls:劣質于對查找到的文件執行”ls -l“命令,輸出文件的詳細信息
-delete:刪除查找到的文件
-fls /path/to/somefile:把查找到的所有文件的顯示出來的詳細信息保存至指定文件中
#find / -perm 7000 -fls /test/perm.txt //將根下特殊權限是7(suid、sgid、sticky)的文件的詳細信息保存到/test/perm.txt文件中
-ok command {} \; :對查找到的每個文件執行由command指定的命令
其中:{ } 此表示前面find查找到的內容, \ ;則表示-ok命令結束 ,斜杠“\”是為后面的分號";"轉義 #find ./ -nouser -a -nogroup -ok chown root:root {} \; //將當前目錄下既沒有屬主也沒有屬組的文件執行chown命令將其屬主屬組改為root,
-exec command {} \; :對查找到的所有文件執行由command指定的命令
#find ./ -perm /002 -exec mv { } { }.danger \; //將當前目錄下其他用戶權限為2(因為屬主屬組為0,即忽略匹配)的文件移動到當前文件并更名為當前名加" .danger"后綴。
注意:
1、-ok 和 -exec的區別在與-ok每次對文件執行命令是會跟用戶交互操作,而-exec則直接把查找到的文件執行指定的命令,不和用戶交互
2、find 傳遞查找到的文件路徑至后面的命令時,是先查找出所有符合條件的文件路徑,并一次性傳遞給后面的命令,但是有些命令不能接受過長的參數,此時命令執行失敗,另一種方式可躲避此問題,(find | xarg command),xarg 則表示把命令的參數轉換為一個一個字符傳給命令
原創文章,作者:Lii,如若轉載,請注明出處:http://www.www58058.com/34698
寫的很詳細,有理論有實踐,find命令是筆試中必考的內容跟,所以需要多多聯系,熟練掌握