1. 程式人生 > 其它 >linux基礎之find檔案查詢

linux基礎之find檔案查詢

##1.find查詢概述

####1.1為什麼需要查詢

1.很多時候我們可能會忘了檔案所在的位置,此事情就需要通過find來查詢

2.有時候需要通過內容查詢到對應的檔案,此時就需要通過find來查詢

1.2為什麼是find

因為find命令可以根據不同的條件來進行查詢檔案
例:
檔名稱
檔案大小
檔案時間
屬主屬組
許可權等等

可以通過以上幾種方式查詢檔案,從而實現精準定位

####1.3find命令語法

find + 路徑(path...) + 選項(options) + 表示式(expression) + 動作(action)

##2.find查詢示例

2.1find基於名稱查詢

1.建立檔案

touch /etc/sysconfig/network-scripts/{ifcfg-eth1,IFCFG-ETH1}

2.查詢/etc目錄下包涵ifcfg-eth0名稱的檔案

[root@node: etc]#find /etc -name "ifcfg-eth1"
/etc/sysconfig/network-scripts/ifcfg-eth1

3.-i忽略大小寫

查詢/etc目錄下包涵ifcfg-eth名稱所有檔案
[root@node: etc]#find /etc i-name "ifcfg-eth1*"

2.2find基於大小查詢
+5 大於5M
-5 小於5M
5 等於5M

查詢大於5M的檔案
[root@node: etc]#find /etc -size +5M

小於5M則是—,等於5則不加


查詢大於5M小於7M
建立一個6M的檔案
[root@node: etc]#dd if=/dev/zero of=/etc/big count=6M bs=1

查詢大於5M小於7M
[root@node: etc]#find /etc -size +5M  -a -size -7M | xargs ls -lh

-rw-r--r--. 1 root root 6.0M Jul 17 15:04 /etc/big

####2.3find基於型別查詢

檔案

[root@node: ~]#find /dev -type f

目錄

[root@node: ~]#find /dev -type d

l 連結
[root@node: ~]#find /dev -type l

b塊裝置
[root@node: ~]#find /dev -type b

c字元裝置
[root@node: ~]#find /dev -type c

s套接字
[root@node: ~]#find /dev -type s

p管道檔案
[root@node: ~]#find /dev -type p

####2.4find基於時間查詢

1.建立測試檔案(後期shell會講)

[root@node: ~]#for i in {01..10};do date -s 201904$i && touch file-$i;done

查詢7天以前的檔案(不會列印當天的檔案)  7天以前的查找出來,然後刪除 == 保留了最近7天的資料
[root@node: ~]#for i in {01..10};do date -s 201904$i && touch file-$i;done

3.查詢最近7天的檔案,不建議使用(會列印當天的檔案)將最近7天的資料給列出來,如果刪除,會將當天的資料刪除

[root@node: ~]#find ./ -iname "file-*" -mtime -7


查詢第7天的檔案(不會列印當天的檔案)

[root@node: ~]#find ./ -iname "file-*" -mtime 7


查詢最近122分鐘發生變化的檔案

[root@node: ~]#find  ./ -type f -mmin -122

查詢多少分鐘內發生過修改的檔案
[root@node: ~]#find ./ -type f -mmin -30

查詢系統有哪些命令在最近多長時間內,發生過變化
[root@node: ~]#find /bin/ /sbin/ -type f -mmin -5

面試題:查詢/var/log下所有以.log結尾的檔案,並保留最近7天的log檔案

[root@node: log]#find /var/log -type f -name "*.log" -a -mtime +7 -delete

[root@node: log]#find /var/log -type f -name "*.log" -a -mtime +7 | xargs rm -f 

####2.5find基於使用者查詢

-user 屬主
-group 屬組
-nouser 不屬主
-nogroup 不屬組

例:

查詢/home目錄下屬主是jake的檔案

[root@node: log]#find /home -user jake


查詢屬組是admin

[root@node: log]#find /home -group admin

查詢屬主是jake,屬組是admin
[root@node: log]#find /home -user jake -group admin

查詢屬主是jake,並且屬組是admin

[root@node: log]#find /home -user jake -a -group admin

查詢沒有屬主

[root@node: log]#find /home -nouser


查詢沒有屬組

[root@node: log]#find /home -nogroup

查詢沒有屬主或屬組

[root@node: log]#find /home -nouser -o -nogroup

####2.6find基於許可權查詢

-perm [/|-]MODE

MODE:精確許可權匹配  如644

-MODE: 每一類物件都必須同時擁有指定的許可權;(並且的意思)

/MODE:任何一類(UGO)只要有一位匹配即可;(或者的關係)

例: 精確

[root@node: ~]#find /root -type f -perm 644 -ls

-包含: (u涵蓋6,並且g涵蓋4,並且o涵蓋4)

[root@node: ~]#find /root -type f -perm -644 -ls

/或者(u為6,或者g為4,或者o為0)

[root@node: ~]#find /root -type f -perm /640 -ls

特殊許可權(最低許可權是4000 4755也滿足需求)

[root@node: ~]#find /usr/bin/ /usr/sbin/ -type f -perm -4000 -ls

root@node: ~]#find /usr/bin/ /usr/sbin/ -type f -perm -2000 -ls

[root@node: ~]#find /usr/bin/ /usr/sbin/ -type f -perm -1000 -ls

####2.7find邏輯運算子

-a 與(並且)

-o 或(或者)

-not|! 非(取反)

例:查詢當前目錄下,屬主不是root的所有檔案

[root@node: ~]#find . -not -user root


查詢當前目錄下,屬主屬於hdfs,並且大小大於1k的檔案

[root@node: ~]#find . -type f -user hdfs -a -size +1k

查詢當前目錄下的屬主為root或者以xml結尾的普通檔案

[root@node: ~]#find -type f -a -user root -o -name "*xml"

##3. find動作處理

查詢到一個檔案後,需要對檔案進行如何處理find的預設動作是-print

動作 含義
-print 列印查詢到的內容(預設)
-ls 以長格式顯示的方式列印查詢到的內容
-delete 刪除查詢到的檔案(僅能刪除空目錄)
-ok 後面跟自定義shell命令(去提示是否操作)
-exec 後面跟自定義shell命令(標準寫法-exec ;)

####3.1find結合exec

使用-exec實現檔案拷貝和刪除

[root@node: ~]#find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \;

[root@node: ~]# find /etc -name "ifcfg*" -exec rm -f {} \;

[root@node: ~]#find /etc -name "ifcfg*" -exec mv -rvf {} /tmp \;

####3.2find結合xargs

xargs將前者命令查詢到的檔案作為一個整體傳遞後者命令的輸出,所以其操作的效能極高

|xargs rm -f 1 2 3 4 5 6 7 8 9 10 11 100000

exec是將檔案一個一個的處理,所以處理效能極低

####3.3find結合grep

當忘記重要配置1檔案儲存路徑時,可以通過搜尋關鍵字獲取檔案其路徑

[root@node: ~]#find /code -type f |xargs grep -R "MySQL_PASSWORD"


[root@node: ~]#find /etc/ -type f | /etc/pass: oldxu.com