在linux中,查找命令主要有find和grep,以及mlocate/locate
區別:(1)find命令是根據文件的屬性進行查找,如文件名,文件大小,所有者,所屬組,是否為空,訪問時間,修改時間等。
(2)grep是根據文件的內容進行查找,會對文件的每一行按照給定的模式(patter)進行匹配查找。
(3)mlocate(locate) 命令用來查找文件或目錄,速度快。
一、find命令
find 是文件層次的查找(包括子目錄,就是對當前路徑樹查找)
基本格式:find path name
基本格式:find path name
1、按照文件名查找
(1)find /opt -name abc.txt #在/opt目錄下查找文件abc.txt
(2)find /opt -name abc.txt #在/opt目錄下文件abc.txt
(3)find /opt -name '*abc*' #使用通配符*。表示在/opt目錄下查找文件名中含有字符串‘abc’的文件
(4)find / -name 'abc*' #表示當前目錄下查找文件名開頭是字符串‘abc’的文件
(2)find /opt -name abc.txt #在/opt目錄下文件abc.txt
(3)find /opt -name '*abc*' #使用通配符*。表示在/opt目錄下查找文件名中含有字符串‘abc’的文件
(4)find / -name 'abc*' #表示當前目錄下查找文件名開頭是字符串‘abc’的文件
2、可指定文件類型查找
find / -name "abc*" -type d # 查找類型為目錄類型find / -name "abc*" -type f # 查找類型為文件類型
-type t
True if the file is of the specified type. Possible file types
are as follows:
b block special
c character special
d directory
f regular file
l symbolic link
p FIFO
s socket
3、控制目錄查找深度
-maxdepth number
find / -name "abc*" -maxdepth 2 # 查找到二級目錄
find / -name "abc*" -maxdepth 2 # 查找到二級目錄
4、按照文件特征查找
時間:
(1)find / -amin -10 # 查找在系統中最后10分鍾訪問的文件(access time)
(2)find / -atime -1 # 查找在系統中最后24小時訪問的文件
(3)find / -mmin -10 # 查找在系統中最后10分鍾里修改過的文件(modify time)
(1)find / -amin -10 # 查找在系統中最后10分鍾訪問的文件(access time)
(2)find / -atime -1 # 查找在系統中最后24小時訪問的文件
(3)find / -mmin -10 # 查找在系統中最后10分鍾里修改過的文件(modify time)
(4)find / -mtime -2 #查找在系統中最后48小時里修改過的文件
補充:history 10 #表示查看系統最后使用的10條命令
大小:
(1)find / -size +100M #查找出大於100M字節的文件(c:字節,w:雙字,k:KB,M:MB,G:GB)
(2)find / -size -100M #查找出小於100M的文件
補充:history 10 #表示查看系統最后使用的10條命令
大小:
(1)find / -size +100M #查找出大於100M字節的文件(c:字節,w:雙字,k:KB,M:MB,G:GB)
(2)find / -size -100M #查找出小於100M的文件
其他:
(1)find / -empty # 查找為空的文件/夾
(2)find / -user ljw #查找屬於用戶是ljw的文件/夾
(3)find / -group ljw # 查找group(組)為ljw的文件/夾
(1)find / -empty # 查找為空的文件/夾
(2)find / -user ljw #查找屬於用戶是ljw的文件/夾
(3)find / -group ljw # 查找group(組)為ljw的文件/夾
5.使用混合查找方式查找文件
參數有: !,-and(-a),-or(-o)
(1) find /opt -size +100M -and -mtime +10 #在/opt目錄下查找大於100M並在最后10分鍾內修改的文件
(2) find / -user ljw -or -user ljw1 #在/目錄下查找多個用戶是ljw或者ljw1的文件文件
(3) find /opt ! -user ljw #在/opt目錄中查找所有不屬於用戶ljw的文件
(2) find / -user ljw -or -user ljw1 #在/目錄下查找多個用戶是ljw或者ljw1的文件文件
(3) find /opt ! -user ljw #在/opt目錄中查找所有不屬於用戶ljw的文件
二、grep 命令
基本格式:grep 字符串 路徑1、主要參數
[options]主要參數:
-c:只輸出匹配行的計數。
-i:不區分大小寫
-h:查詢多文件時不顯示文件名。
-l:查詢多文件時只輸出包含匹配字符的文件名。
-n:顯示匹配行及行號。
-s:不顯示不存在或無匹配文本的錯誤信息。
-v:顯示不包含匹配文本的所有行。
-c:只輸出匹配行的計數。
-i:不區分大小寫
-h:查詢多文件時不顯示文件名。
-l:查詢多文件時只輸出包含匹配字符的文件名。
-n:顯示匹配行及行號。
-s:不顯示不存在或無匹配文本的錯誤信息。
-v:顯示不包含匹配文本的所有行。
2、grep -r "字符串"
(1)grep 'test' d* #顯示所有以d開頭的文件中包含 test的行
(2)grep ‘test’ aa bb cc #顯示在aa,bb,cc文件中包含test的行
(3)grep ‘[a-z]\{5\}’ aa #顯示所有包含每行字符串至少有5個連續小寫字符的字符串的行
(4)grep magic /usr/src #顯示/usr/src目錄下的文件(不含子目錄)包含magic的行
(5)grep -r magic /usr/src #顯示/usr/src目錄下的文件(包含子目錄)包含magic的行
(2)grep ‘test’ aa bb cc #顯示在aa,bb,cc文件中包含test的行
(3)grep ‘[a-z]\{5\}’ aa #顯示所有包含每行字符串至少有5個連續小寫字符的字符串的行
(4)grep magic /usr/src #顯示/usr/src目錄下的文件(不含子目錄)包含magic的行
(5)grep -r magic /usr/src #顯示/usr/src目錄下的文件(包含子目錄)包含magic的行
(6)grep -w pattern files :只匹配整個單詞,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
3、grep 可以結合其他命令使用,效果也很好
例如利用通道‘|’查找文件grep -Rl 'name' /opt # 查找文件內容。其中查找的字符串,可不寫引號''。
遞歸查找文件,在路徑/opt下(包括子目錄),找出文件內容中含有字符串'找我'的文件。顯示為路徑和文件名。
1. find | grep name
# 查找目錄
查找出當前目錄和子目錄的文件名中含有name的文件
查找出當前目錄和子目錄的文件名中含有name的文件
即find查找出當前目錄和子目錄下的文件名,利用管道 | 交給grep過濾出含有name的那幾行,間接查找出文件。
其中find和grep可字行添加所需參數
其中find和grep可字行添加所需參數
2. find | xargs grep name # 查找文件內容
查找出當前目錄和子目錄的文件內容中含有name的行
與 xargs 結合,可以傳遞各種選項來調整你的輸出,並刪除找到的那些文件。
查找出當前目錄和子目錄的文件內容中含有name的行
與 xargs 結合,可以傳遞各種選項來調整你的輸出,並刪除找到的那些文件。
3. ll | grep luoluo # 查找文件
類似find | grep luoluo,只是不能遞歸查找子目錄下的文件名
類似find | grep luoluo,只是不能遞歸查找子目錄下的文件名
4.rpm -qa | grep '軟件名' #查找安裝的軟件
三、mlocate/locate 文件查找
對於文件數量龐大的時候,可以使用此方法查找
mlocate和locate 命令一樣,下面就不再寫locate了。至於mlocate和locate的關系,最后面會具體說一下。
locate命令其實是“find -name”的另一種寫法,但是要比后者快得多。
Linux系統自動創建這個數據庫,並且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。
mlocate和locate 命令一樣,下面就不再寫locate了。至於mlocate和locate的關系,最后面會具體說一下。
locate命令其實是“find -name”的另一種寫法,但是要比后者快得多。
Linux系統自動創建這個數據庫,並且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。
1、使用命令
mlocate abc.txt #直接搜索文件
mlocate ~/m # 搜索用戶主目錄下,所有以m開頭的文件。
mlocate /etc/abc # 搜索etc目錄下所有以abc開頭的文件。
mlocate -ie abc.txt #如果 abc.txt已經刪除了,使用-e會檢查文件是否真實存在,而不必updatedb,-i,忽略大小寫。
mlocate ~/m # 搜索用戶主目錄下,所有以m開頭的文件。
mlocate /etc/abc # 搜索etc目錄下所有以abc開頭的文件。
mlocate -ie abc.txt #如果 abc.txt已經刪除了,使用-e會檢查文件是否真實存在,而不必updatedb,-i,忽略大小寫。
mlocate /etc/*abc #在/etc中查找含有字符串abc的文件。
2、准備工作
先安裝mlocate/locate工具命令,創建數據庫(創建索引),然后更新數據庫。安裝工具命令:
yum install mlocate
yum install updatedb
updatedb #updatedb更新數據庫,即文件庫。
3、整個locate/mlocate工作其實是由四部分組成的:
/usr/bin/updatedb #主要用來更新數據庫,可通過crontab自動完成的/usr/bin/locate #查詢文件位置的程序(查詢時是改程序運行,進行查找),也可能是mlocate。
/etc/updatedb.conf #updatedb的配置文件,用來配置數據庫中要放入或排除哪些目錄和文件等
/var/lib/mlocate/mlocate.db #存放文件信息的文件,文件名和對於的目錄。
4、mlocate默認不搜索的文件:
即寫入 updatedb的配置文件 /etc/updatedb.conf的文件。PRUNE_BIND_MOUNTS="yes"
PRUNEFS="ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf"
PRUNENAMES=".git .bzr .hg .svn"
PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/afs /tmp /var/spool /media"
解釋:
第一行 "yes":是否進行限制搜索。
第二行 排除檢索的文件系統類型。
第三行 排除檢索的后綴文件。
第四行 排除檢索的路徑,且對路徑下的子文件夾也不檢索。
第一行 "yes":是否進行限制搜索。
第二行 排除檢索的文件系統類型。
第三行 排除檢索的后綴文件。
第四行 排除檢索的路徑,且對路徑下的子文件夾也不檢索。
5、關於mlocate和locate:
mlocate有一個近親:slocate,它安全地( s 代表安全)記錄了相關的文件權限,以防止非特權用戶看到特權文件。此外,還有它們所起源的一個更老的,原始 locate 命令。
mlocate與locate和slocate的不同之處在於,在每次掃描文件系統,更新數據庫時,mlocate 不需要持續重新掃描所有的文件系統。mlocate 在數據庫中保存了時間戳信息,無需重新讀取,就能判斷目錄內容是否改變。所以更新的速度更快,對硬盤的占用也更少。
這是mlocate特有的功能。相反,它將其發現的文件(m代表合並)與現有的文件列表合並在一起,使其可以借助系統緩存從而性能更高、更輕量級。由於mlocate流行,所以也簡稱其為 locate。
mlocate和locate命令的一個關鍵組件,名為 updatedb,更新數據庫的命令。
updatedb 通過cron任務定期運行,通常在一天中的安靜時間運行。
在文件 /etc/cron.daily/mlocate.cron 的內部(該文件的路徑及其內容可能因發行版而不同)。每天如何觸發 “updatedb” 命令。
updatedb 通過cron任務定期運行,通常在一天中的安靜時間運行。
在文件 /etc/cron.daily/mlocate.cron 的內部(該文件的路徑及其內容可能因發行版而不同)。每天如何觸發 “updatedb” 命令。
關於配置文件的內容可以參考該文章:https://linux.cn/article-9053-1-rel.html