文件查找命令locate和find詳解
locate
配合數據庫緩存,快速查看文件位置,非實時查找( 數據庫查找) find
實際搜尋硬盤查詢文件名稱 ,實時查找
locate簡介
locate命令其實是find -name
的另一種寫法,但是要比后者快得多,原因在于它不搜索具體目錄,而是搜索一個數據庫/var/lib/locatedb
,這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,并且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb
命令,手動更新數據庫。
locate 命令
locate KEYWORD
有用的選項 -i
執行區分大小寫的搜索 -n
N 只列舉前N 個匹配項目
實例:
手動更新數據庫
[root@localhost ~]# updatedb
搜索etc目錄下所有以sh開頭的文件:
[root@localhost ~]# locate /etc/sh
搜索用戶主目錄下,所有以m開頭的文件:
[root@localhost ~]# locate ~/m
搜索用戶主目錄下,所有以m開頭的文件,并且忽略大小寫:
[root@localhost ~]# locate -i ~/m
使用Regex 來搜索以“.foo ”結尾的文件
[root@localhost ~]# locate -r ‘\.foo$’
find簡介
find
命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則find
命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示。
find [OPTION]…
[ 查找路徑]
[ 查找條件]
[ 處理動作]
查找路徑
:指定具體目標路徑;默認為當前目錄查找條件
:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件處理動作
:對符合條件的文件做操作,默認輸出至屏幕
[查找路徑]
不輸入代表當前目錄
例:
find
find /boot
查找條件
根據文件名和inode 查找
-name
” 文件名稱”:支持使用glob*, ?, [], [^]-iname
” 文件名稱”:不區分字母大小寫-inum n
按inode 號查找-samefile name
相同inode 號的文件-links n
鏈接數為n 的文件-regex "PATTERN"
:以PATTERN 匹配整個文件路徑字符串,而不僅僅是文件名稱
[root@localhost ~]# useradd user1
[root@localhost ~]# useradd vipuser3
[root@localhost ~]# touch /home/user1/aaausercccc
[root@localhost ~]# find /home/ -name *user*
根據屬主、屬組查找 -user USERNAME
:查找屬主為指定用戶(UID) 的文件 -group GRPNAME
: 查找屬組為指定組(GID) 的文件 -uid UserID
:查找屬主為指定的UID 號的文件 -gid GroupID
:查找屬組為指定的GID 號的文件 -nouser
:查找沒有屬主的文件 -nogroup
:查找沒有屬組的文件
例:查找home目錄下的死神的文件
[root@localhost ~]# find /home -user zhanghe
查找條件
根據文件類型查找:
-type TYPE: f
: 普通文件 d
: 目錄文件 l
: 符號鏈接文件 s
:套接字文件 b
: 塊設備文件 c
: 字符設備文件 p
: 管道文件
實例:
分別查看home下得文件和目錄
[root@localhost ~]# find /home/ -type d
[root@localhost ~]# find /home/ -type f
組合條件:
與:-a
或:-o
非:-not
,!
實例:
在/root找其他人可以寫的文件
[root@localhost ~]# find -type f -a -perm -002
[root@localhost ~]# find -type f -and -perm /o+w
./b.sh
其他人可以執行的非普通文件的文件
[root@localhost ~]# find ! -type f -and -perm -001
根據文件大小來查找
-size [+|-]#UNIT
文件大小單元: b
—— 塊(512字節) c
—— 字節 w —— 字(2字節) k
—— 千字節 M
—— 兆字節 G
—— 吉字節
搜索大于10KB的文件
find . -type f -size +10k
搜索小于10KB的文件
find . -type f -size -10k
搜索等于10KB的文件
find . -type f -size 10k
基于目錄深度搜索
向下最大深度限制為3
find . -maxdepth 3 -type f
搜索出深度距離當前目錄至少2個子目錄的所有文件
find . -mindepth 2 -type f
根據時間戳:
find . -type f 時間戳
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
根據權限查找
find -perm 755
會匹配權限模式恰好是755
的文件
只要當任意人有寫權限
時,find -perm +222
就會匹配
只有當每個人都有寫權限
時,find -perm -222
才會匹配
只有當其它人(other )有寫權限
時,find -perm -002
才會匹配當前目錄下搜索出權限為777的文件
find . -type f -perm 777
找出當前目錄下權限不是644的php文件
find . -type f -name "*.php" ! -perm 644
找出當前目錄用戶tom擁有的所有文件
find . -type f -user tom
找出當前目錄用戶組sunk擁有的所有文件
find . -type f -group sunk
處理動作
-print
:默認的處理動作,顯示至屏幕; -ls
:類似于對查找到的文件執行“ls -l” 命令 -delete
:刪除查找到的文件; -fls file
:查找到的所有文件的長格式信息保存至指定文件中 -ok COMMAND {} \
; 對查找到的每個文件執行由COMMAND 指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認 -exec COMMAND {} \
; 對查找到的每個文件執行由COMMAND 指定的命令 {}
: 用于引用查找到的文件名稱自身
find 傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題
find | xargs COMMAND
備份配置文件,添加.orig 這個擴展名
find -name “*.conf” -exec cp {} {}.org \;
提示刪除存在時間超過3天以上的joe 的臨時文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在你的主目錄中尋找可被其它用戶寫入的文件
find ~ -perm -002 -exec chmod o-w {} \;
在data目錄里面查找文件是644權限的.sh結尾 然后修改權限為755
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
查找home下的目錄并列出
find /home –type d -ls
借助-exec選項與其他命令結合使用
找出當前目錄下所有root的文件,并把所有權更改為用戶tom
find .-type f -user root -exec chown tom {} \;
上例中,{} 用于與-exec選項結合使用來匹配所有文件,然后會被替換為相應的文件名。 找出自己家目錄下所有的.txt文件并刪除
find $HOME/. -name "*.txt" -ok rm {} \;
上例中,-ok和-exec行為一樣,不過它會給出提示,是否執行相應的操作。 查找當前目錄下所有.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 {} \;
搜索但跳出指定的目錄 查找當前目錄或者子目錄下所有.txt文件,但是跳過子目錄sk
find . -path "./sk" -prune -o -name "*.txt" -print
原創文章,作者:M20_he,如若轉載,請注明出處:http://www.www58058.com/36508
文章對find的常見選項用了具體的操作和練習,課堂作業需要附加在后面,這也是需要用心完成的哦。