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
動作 | 含義 |
---|---|
打印查找到的內容(默認) | |
-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 定位路徑,定位他的特征(名稱、大小、時間、屬主、類型)、多個表達式一起使用、定位后得到結果
可以通過動作來處理(查看、列出、拷貝、刪除...........)