Linux-find文件查找


1.為什么要有文件查找?

因為很多時候我們可能會忘了某個文件所在的位置,此時就需要通過find來查找。
find命令可以根據不同的條件來進行查找文件,例如:文件名稱、文件大小、文件修改時間、屬主屬組、權限、等等方式。同時find命令是Linux下必須掌握的。

find 命令的基本語法如下

命令 路徑 選項 表達式 動作
find [path...] [options] [expression] [action]

2.find查找示例

find針對文件名稱、大小、類型、時間等方式進行查找文件?

1.find名稱查找[-name]

#1.創建文件
touch /etc/sysconfig/network-scripts/{ifcfg-eth1,IFCFG-ETH1}

#2.查找/etc目錄下包含ifcfg-eth0名稱的文件
find /etc/ -name "ifcfg-eth1"

#3.-i 忽略大小寫
find /etc/ -iname "ifcfg-eth1"

#查找/etc目錄下包含ifcfg-eth名稱所有文件
find /etc/ -name "ifcfg-eth*"
find /etc/ -iname "ifcfg-eth*"

2.find大小查找[-size]

#1.查找大於5M的文件()
find /etc -size +5M

#2.查找等於5M的文件
find /etc -size 5M

#3.查找小於5M的文件
find /etc -size -5M 


3.find類型查找

# f 文件
find /dev -type f

# d 目錄
find /dev -type d

# l 鏈接
find /dev -type l

# b 塊設備
find /dev -type b

# c 字符設備
find /dev -type c

# s 套接字
find /dev -type s

#通過多個查找條件的方式,精確的定位到某些匹配的資源.
查找/etc目錄下類型是文件的,並且名稱  大概是 ifcfg-*
find /etc -type f  -name "ifcfg-*"

查找/sbin/目錄下,類型是軟鏈接的,並且名稱是xx的,並且大小大於10k
find /sbin/ -type l -name "xx" -size +10k

查找名稱包含eth0的文件並且小於2M的文件
find /etc/ -iname "*eth1*" -type f -size -2M |xargs ls -lh

4.find時間查找[-mtime]

#1.創建測試文件(shell相關)
# for i in {01..29};do date -s  202202$i && touch file-$i;done

打印當天的文件===計不計算本地當天時間文件
#2.查找7天以前的文件(不會打印當天的文件)=====( 保留了最近7天的數據)
# find ./ -iname "file-*" -mtime +7

#3.查找最近7天的文件,不建議使用(會打印當天的文件[當天時間計算])
# find ./ -iname "file-*" -mtime -7

#4.查找第7天文件(不會打印當天的文件)
# find ./ -iname "file-*" -mtime 7

#5.本地文件保留最近7天的備份文件, 備份服務器保留3個月的備份文件(實際使用方案)
find /backup/ -iname "*.bak" -mtime +7 -delete
find /backup/ -iname "*.bak" -mtime +90 -delete

5.find用戶查找

#查找屬主是jack
# find /home -user jack

#查找屬組是admin
# find /home -group admin

#查找屬主是jack, 屬組是admin
# find /home -user jack -group admin

#查找屬主是jack, 並且屬組是admin
# find /home -user jack -a -group admin

#查找屬主是jack, 或者屬組是admin
# find /home -user jack -o -group admin

#查找沒有屬主
# find /home -nouser

#查找沒有屬組
# find /home -nogroup

#查找沒有屬主或屬組
# find /home -nouser -o -nogroup

3.find查找后的處理動作?

find動作處理,比如查找到一個文件后,需要對文件進行如何處理, find的默認動作是 -print

動作 含義
-print 打印查找到的內容(默認)
-ls 以長格式顯示的方式打印查找到的內容
-delete 刪除查找到的文件(僅能刪除空目錄)
-ok 后面跟自定義 shell 命令(會提示是否操作)
-exec 后面跟自定義 shell 命令(標准寫法 -exec 😉

1.find查找后的動作命令示例

#1.使用-print打印查找到的文件
# find /etc -name "ifcfg*"
# find /etc -name "ifcfg*" -print

#2.使用-ls打印查找到的文件,以長格式顯示
# find /etc -name "ifcfg*" -ls

#3.使用-delete刪除文件,但僅能刪除空目錄
# find /etc -name "ifcfg*" -delete

#4.使用-ok實現文件拷貝,但會提示是否拷貝 固定語法: -ok {} \;
# find /etc -name "ifcfg*" -ok cp -v {} /tmp \;

#5.使用-exec實現文件拷貝和文件刪除。
# find /etc -name "ifcfg*" -exec cp -v {} /tmp \;
# find /etc -name "ifcfg*" -exec rm -f {} \;

ps: -ok和-exec區別,一個會提供一個不會

2.使用exec刪除和使用系統命令xargs刪除區別

exec  一個一個的刪除
	rm -f ifcfg-eth0
	rm -f ifcfg-eth1
	rm -f ifcfg-eth2

xargs 一次干掉
	rm -f  ifcfg-eth0 ifcfg-eth1 ifcfg-eth2

模擬驗證結果:
	exec
# touch file-{1..50000}
# time find ./ -type f -name "file-*" -exec rm -f {} \;
real	0m53.149s
user	0m14.100s
sys	0m34.368s

	xargs
# touch file-{1..50000}
# time find ./ -type f -name "file-*" |xargs rm -f
real	0m1.583s
user	0m0.174s
sys	0m1.225s

ps:一般使用xargs,xargs快

3.記得文件的內容是什么,但是不清楚文件名稱是什么,也不知道路徑在哪,怎么辦?

find 查找文件 通過 grep 篩選查找出來的文件內容

查找/etc目錄下,所有類型是文件的,然后將查找到的結果作為grep篩選條件的參數[--color=auto高亮顯示輸出]
find /etc  -type f  |  xargs grep "proxy" --color=auto
或
grep -iR "proxy" /etc/*

4.find邏輯運算符【-a、-o、!】

符號 作用

-a 與 and 默認寫法不需加

-o 或 or

! 非 -not

1.查找當前目錄下,屬主不是root的所有文件

# find . -not -user root 
# find . ! -user root     

2.查找當前目錄下,屬主屬於kk,並且大小大於1k的文件

# find /etc -type f -user kk -size +1k
# find /etc -type f -user kk -a -size +1k
# find /etc -type f -user kk -and -size +1k

3.查找當前目錄下的屬主為root或者以xml結尾的普通文件

# find . -type f \( -user root -o -name "*.xml" \) -ls

5.find相關練習題

1.查找/tmp目錄下,屬主不是root,且文件名不以f開頭的文件

# find /tmp -type f ! -user root ! -name "f*"

2.查找/var目錄下屬主為root,且屬組為mail的所有文件

# find /var -user root -group mail -ls

3.查找/var目錄下不屬於root、lp、adm的所有文件

# find /var/ -type f \( ! -user root -o ! -user lp -o ! -user adm \)

4.查找/var目錄下最近一周內產生的文件,同時屬主不為root,也不是postfix的文件

# find  /var -type f -mtime -7 ! -user root  ! -name "postfix"

5.查找/etc目錄下大於1M且類型為普通文件的所有文件

# find /etc/ -type f -size +1M

6.將/etc/中的所有目錄(僅目錄)復制到/tmp下,目錄結構不變

# find  /etc -type d -exec mkdir /tmp/{} -p \;

7.將/etc目錄復制到/var/tmp/,/var/tmp/etc的所有目錄權限777/var/tmp/etc目錄中所有文件權限666

# cp  -rp /etc/ /var/tmp/
# find /var/tmp/etc/ -type d -exec chmod 777 {} \;
# find /var/tmp/etc/ -type f -exec chmod 666 {} \;

8.保留/var/log/下最近7天的日志文件,其他全部刪除

# find /var/log/ -type f -name "*.log" -mtime +7 |xargs rm -f

9.創建touch file{1..10}10個文件, 保留file9,其他一次全部刪除

# find ./ -type f -name "file*" ! -name "file9" | xargs rm -f

10.解釋如下每條命令含義

mkdir /root/dir1
touch /root/dir1/file{1..10}

查看xx目錄下名稱是file5的文件
find /root/dir1 -type f -name "file5"

查看xx目錄下名稱不是file5的文件
find /root/dir1 ! -name "file5"

查看xx目錄下名稱是file5或名稱是file9的文件
find /root/dir1 -name "file5" -o -name "file9"

查看xx目錄下名稱是file5或名稱是file9的文件,然后以長格式的形式輸出到屏幕上
find /root/dir1 -name "file5" -o -name "file9" -ls     只能查到file9
find /root/dir1 \( -name "file5" -o -name "file9" \) -ls   兩個文件都可以查到

查看xx目錄下名稱是file5或名稱是file9的文件,然后刪除並顯示刪除過程
find /root/dir1 \( -name "file5" -o -name "file9" \) -exec rm -vf {} \;

查看xx目錄下名稱不是file4或file8的文件並刪除
find /root/dir1  ! \( -name "file4" -o -name "file8" \) -exec rm -vf {}  \; 

總結:定位一個文件時

​ find 定位路徑,定位他的特征(名稱、大小、時間、屬主、類型)、多個表達式一起使用、定位后得到結果

​ 可以通過動作來處理(查看、列出、拷貝、刪除...........)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM