Linux檔案查詢find

2021-09-30 20:05:57 字數 4042 閱讀 1029

列出資料夾下所有內容(包括目錄、檔案和子目錄中內容,深度優先遍歷):

find . 資料夾名
以上方法列印出來檔案是以換行符分隔,可以連著列印而不分隔,當檔名中有換行符時用:

find . 資料夾名 -print0
根據名字查詢檔案:

find . 目錄名 -name "檔名"
以上命令中目錄名為要搜尋的目錄,檔名可以用萬用字元搜尋,如果要同時搜尋多個檔名,可以用"\( -name 檔名 -o -name 檔名 \)"代替檔名。-name選項有乙個變形是-iname,-iname可以在匹配時不區分大小寫。

可以匹配整體路徑代替檔名:

[student@myhost e]$ find . -path "*b*" 

./a/a.b

./b

以上命令會匹配出目錄下的帶有hhh的路徑如:/ddd/hhh或/ttt/hhh.txt。

find也可以用正規表示式形式匹配名字:

[student@myhost ~]$ find . -regex ".*\(\.txt\|\.log\)$" 2>/dev/null

./.mozilla/firefox/44ud8utl.default/revocations.txt

./.mozilla/firefox/44ud8utl.default/sitesecurityservicestate.txt

以上命令中若是用引數-iregex則匹配時忽略大小寫。

find也可以使用否定引數:

[student@myhost a]$ find . ! -name *.a

../a.b

我們也可以限制find命令搜尋的目錄深度:

[student@myhost e]$ ls a/a.a

a/a.a

[student@myhost e]$ find . -maxdepth 1 -name a.a #我們限制了深度為1,即為當前目錄,找不到a目錄下的a.a檔案

[student@myhost ~]$ ls e/a.a e/a/a.a

e/a.a e/a/a.a

[student@myhost ~]$ find e -mindepth 2 -name a.a #限制了深度為2,當前目錄中a.a檔案未找到

e/a/a.a

以上限定目錄深度的引數應該出現在所有引數的前面位置,如果-type選項在深度限制引數前,find命令會先找到所有指定type的檔案,再篩選出指定層數的檔案,影響效率。

列出所有目錄:

find . -type d
引數含義d

目錄f普通檔案

l符號鏈結

c字元裝置

b塊裝置

s套接字

pfifo

根據時間搜尋:

每個unix/linux檔案中都有三種時間戳:

訪問時間(-atime):最後一次訪問檔案的時間。

修改時間(-mtime):最後一次修改檔案的時間。

變化時間(-ctime):元資料(如許可權、所有權)最後一次變化的時間。

以上三種引數用整數作引數,還可用+、-控制大於小於:

find . -type f -ctime -7    #找出當前目錄下七天內變化過的檔案

find . -type f -ctime 7 #找出當前目錄下恰好七天前變化過的檔案

find . -type f -ctime +7 #找出當前目錄下超過七天變化過的檔案

也有基於分鐘的引數:

訪問時間(-amin)

修改時間(-mmin)

變化時間(-cmin)

找出比指定檔案更新被修改過的檔案:

[student@myhost ~]$ touch z

[student@myhost ~]$ touch x

[student@myhost ~]$ find . -newer z

../x

根據大小查詢檔案:

find . -type f -size +2k    #找出比2kb大的檔案
單位大小選項有:

選項大小

b塊(512位元組)c位元組

w字=2*ckkb

mmbggb

刪除find到的檔案:

[student@myhost c]$ touch a

[student@myhost c]$ touch b

[student@myhost c]$ find . -newer a -delete

[student@myhost c]$ ls

a

以上命令我們看到-delete選項刪除了比a更新被修改過的檔案(包括目錄,因為沒加-type f選項)。

根據許可權匹配檔案可用-perm選項:

[student@myhost c]$ ll

total 0

-rw-rw-r--. 1 student student 0 jan 26 16:31 a

[student@myhost c]$ find . -type f -perm 664

./a

根據檔案主人搜尋:

[student@myhost c]$ find -type f -user student

./a

以上使用者名稱可用uid代替。

有時候,我們希望對find到的檔案做一些操作比如修改許可權:

[root@myhost c]# ll

total 0

-rw-rw-r--. 1 student student 0 jan 26 16:31 a

[root@myhost c]# find . -name a -exec chown root {} \;

[root@myhost c]# ll

total 0

-rw-rw-r--. 1 root student 0 jan 26 16:31 a

-exec選項即可對找到的檔案進行操作,以上命令中,對找到的檔案進行chown操作,{}代表find出來的檔案。

另乙個例子:

[root@myhost c]# find . -type f -name *.a -exec cat {} \; > all.a
以上例子含義為找到當前目錄及其子目錄下所有.a檔案並集中到all.a中。

又另乙個例子:

[root@myhost c]# find . -type f -mtime +10 -exec cp {} old \;
以上命令可以將當前目錄及其子目錄下所有十天前修改過的檔案移動到old資料夾裡。

又另乙個例子:

[root@myhost c]# find -type f -name *.txt -exec printf "text file:%s\n" {} \;
以上命令可以將當前目錄及其子目錄下所有txt檔名列印出來。

注意:-exec只能接受乙個命令,但我們可以把想執行的命令做成乙個指令碼,將{}放到引數位置即可:

-exec /home/student/commands {} \;
讓find命令搜尋時跳過某些資料夾:

[student@myhost e]$ ls a/a.a a.a

a.a a/a.a

[student@myhost e]$ find . \( -name a -prune \) -o \( -type f -name a.a -print \)

./a.a

以上命令中,-prune選項可以排除目錄,-o具有短路性即當搜尋的目錄為a時即為假時不執行之後的語句,後面的語句中-print不可省略。

linux檔案查詢find

locate基於資料庫索引來查詢檔案,資料庫在開機時一段時間對更新,不會實時更新,資料庫存放在 var lib mlocate mlocate.db 可以用updatedb來手動更新資料庫。優缺點 查詢速度快 模糊查詢 非實時查詢 搜尋的是檔案的全路徑 只搜尋使用者具備讀許可權和執行許可權的目錄 l...

Linux基礎 檔案查詢find

在linux的日常管理中,find的使用頻率很高,熟練掌握對提高工作效率很有幫助。find的語法比較簡單,常用引數的就那麼幾個,比如 name type ctime等。初學的同學直接看第二部分的例子,如需進一步了解引數說明,可以參考find的幫助文件。find語法如下 find 選項 引數 列出當前...

linux檔案查詢find命令

1.locate 與 find命令的區別 locate命令用於查詢檔案,它比find命令的搜尋速度快,它需要乙個資料庫,這個資料庫由每天的例行工作 crontab 程式來建立。當我們建立好這個資料庫後,就可以方便地來搜尋所需檔案了。即先執行 updatedb 無論在那個目錄中均可,可以放在cront...