Linux的查找命令有5個:
1, find:最常用和最強大的查找命令,可以用它找到任何想找的文件。(迅速在指定的範圍內查找到文件)
2,which:在PATH變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果;
3,type:用於區分某個命令到底是由shell自帶的,還是由shell外部的獨立二進制文件提供的。如果一個命令是外部命令,那麼使用-p參數,會顯示該命令的路徑,相當於which命令。type命令其實不能算查找命令;
4,whereis:只能用於程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s);
5,locate:相當於find -name,可快速查找文件
各個命令詳解:
一:find:查找任何文件 (則雞兒強大)
find命令的格式:
find [PATH] [option] [action] ###(find [OPTIONS] [查找起始路徑] [查找條件] [處理動作])
find參數:
1,基於文件名的搜索
與文件名有關的參數:
find / -name filename: 查找文件名爲filename的文件。filename可使用正則表達式表示。
find / -iname "PATERN" :不區分名稱字母大小寫
示例:查找所有文件名爲passwd的文件。
[root@176-140-17-46 ~]# find / -name passwd
/usr/bin/passwd
/etc/pam.d/passwd
/etc/passwd
[root@176-140-17-46 ~]#
2,基於正則表達式的模式查找。
-regex 同樣屬於測試項。使用-regex時有一點要注意:-regex不是匹配文件名,而是匹配完整的文件名(包括路徑)。
示例:當前目錄下有一個文件"abar9",如果你用"ab.*9"來匹配,將查找不到任何結果,正確的方法是使用".*ab.*9"或者".*/ab.*9"來匹配。 ‘.*’(查找到的文件帶有目錄)
[root@176-140-17-46 opt]# find . -regex ".*ab.*9"
./abar9
[root@176-140-17-46 opt]#
3,基於文件大小的搜索
-size 測試項根據文件的大小查找文件,文件大小既可以用塊(block)來計量,
也可以用字節來計量。默認情況下以塊計量文件大小,若想使用字節來計量只需要在數字參數後加c即可。
與文件大小有關的參數:
-size SIZE:查找文件大小剛好等於SIZE的文件;
-size -SIZE:查找文件大小大於SIZE的文件;
-size +SIZE:查找文件大小小於SIZE的文件。
其中,size的單位有:
c —— byte,字節;
w —— 字(2字節);
b —— bit,塊(512字節);
k —— 千字節;
M —— 兆字節;
G —— 吉字節。
示例:
1,查找文件size小於10個字節的文件或目錄
find ./ -size -10c
2,查找文件size等於10個字節的文件或目錄
find ./ -size 10c
3,查找文件size大於10個字節的文件或目錄
find ./ -size +10c
4,查找文件size小於10k的文件或目錄
find ./ -size -10k
5,查找文件size小於10M的文件或目錄
find ./ -size -10M
6,查找文件size小於10G的文件或目錄
find ./ -size -10G
7,搜索大於10KB的文件
find . -type f -size +10k
8,搜索等於10KB的文件
find . -type f -size 10k
9,查找超過1M的文件
find / -type f -size +1M
10,查找等於6字節的文件
find . -size 6c
4,基於文件類型的搜索
與文件類型有關的參數:
-type TYPE:查找文件的類型爲TYPE的文件。
TYPE的參數列表有:
f :普通文件;
l :符號連接;
d :目錄;
c :字符設備;
b :塊設備;
s :套接字;
p :FIFO。
示例:
1,查找/var目錄下所有類型爲socket的文件:
find /var -type s
2,查找/usr/bin/ 符號鏈接文件 :
find /usr/bin/ -type l
5,基於目錄深度的搜索
與目錄深度有關的參數:
-maxdepth n: n爲數字,表示向下最大深度限制爲n;
-mindepth n: n爲數字,搜索出深度距離當前目錄至少n個子目錄的所有文件。
示例:
1,查找文件,向下最大深度限制爲3
find . -maxdepth 3 -type f
2,搜索出深度距離當前目錄至少2個子目錄的所有文件
find . -mindepth 2 -type f
6,基於時間進行搜索
與時間有關的參數共有 -atime、-ctime、-mtime。下面以 -mtime 說明:
-mtime n: n爲數字,列出在n天之前的“一天之內”被更改過的文件名;
-mtime +n:列出在n天之前(不含第n天本身)被更改過的文件名;
-mtime -n:列出在n天之內(不含第n天本身)被更改過的文件名;
-newer file:file爲一個存在的文件,列出比file還要新的文件名。
示例:
1,查找文件更新日時在距現在時刻二天以內的文件
find ./ -mtime -2
2,查找文件更新日時在距現在時刻二天以上的文件
find ./ -mtime +2
3,查找文件更新日時在距現在時刻一天以上二天以內的文件
find ./ -mtime 2
4,查找文件更新日時在距現在時刻二分以內的文件
find ./ -mmin -2
5,查找文件更新日時在距現在時刻二分以上的文件
find ./ -mmin +2
6,查找文件更新日時在距現在時刻一分以上二分以內的文件
find ./ -mmin 2
7,查找文件更新時間比文件abc的內容更新時間新的文件
find ./ -newer abc
8,查找/etc目錄下,所有比/etc/passwd文件更新的文件。
find /ect -newer /etc/passwd
9,查找文件訪問時間比文件abc的內容更新時間新的文件
find ./ -anewer abc
10,查找從現在開始到24小時前,/etc目錄下所有改動過內容的文件都會被列出來。
find /etc -mtime 0
7,基於用戶或用戶組名進行搜索
用戶或用戶組名有關的參數:
-uid n:n爲數字,表示用戶的UID;
-gid n:n爲數字,表示用戶的GID;
-user name:name爲用戶賬號名稱;
-group name:name爲用戶組名;
-nouser:尋找文件的所有者不存在於/etc/passwd的文件;
-nogroup:尋找文件的所有用戶組不存在於/etc/group的文件。
示例:
1,查找root用戶在/home目錄下的所有文件。
find /home -user root
2,查找組名爲gname的文件或目錄
find ./ -group gname
3,查找屬主被刪除的文件
find / -nouser -type f
4,查找用戶組被刪掉的文件
find / -nogroup -type f
8,基於文件權限進行搜索
文件權限有關的參數:
-perm mode:查找文件權限剛好等於mode的文件;
-perm +mode:查找文件權限“包含任一mode的權限”的文件;
-perm -mode:查找文件權限“必須要全部包括mode的權限”的文件
示例:
1,查找權限爲644的文件或目錄(需完全符合)
find ./ -perm 664
2,查找用戶/組權限爲讀寫,其他用戶權限爲讀(其他權限不限)的文件或目錄
find ./ -perm -664
3,查找用戶有寫權限或者組用戶有寫權限的文件或目錄
find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w
4,查找所有者權限有讀權限的目錄或文件
find ./ -perm -u=r
5,查找用戶組權限有讀權限的目錄或文件
find ./ -perm -g=r
6,查找其它用戶權限有讀權限的目錄或文件
find ./ -perm -o=r
9,使用混合查找方式查找文件
參數有:
! 不屬於
-and(-a) 並
-or(-o) 或者
示例:
1,在/tmp目錄下查找大於10000字節並在最後2分鐘內修改的文件
find /tmp -size +10000c -and -mtime +2
2,在/目錄下查找用戶是fred或者george的文件文件
find / -user fred -or -user george
3,在/tmp目錄中查找所有不屬於panda用戶的文件
find /tmp ! -user panda
10, 1,查找空文件或空目錄
find ./ -empty
2,查找空目錄並刪除
find ./ -empty -type d -delete
3,查找空文件並刪除
find ./ -empty -type f -delete
11,find其他:
1, 僅僅查找非隱藏的文件(不顯示隱藏文件):
find . \( ! -regex ".*/\..*" \)
1,每個文件掩碼的前面都有 -name. 該列表可以擴展爲包括您需要清除的系統中的任何臨時文件類型。在代碼的編譯和連接過程中,程序員及其工具會生成示例中的那些文件類型:a.out, *.o 和 core. 其他的用戶通常也會生成類似的臨時文件,可以使用如 *.tmp, *.junk等文件掩碼來對命令進行相應的編輯。您可能還發現將命令放入一個稱作 clean的腳本中非常有用,當需要清除一個目錄中的內容的時候就可以執行該腳本。
find . \( -name a.out -o -name '*.o' -o -name 'core' \) -exec rm -f {} \;
13,維護 LOG 和 TMP 文件的存儲空間
,1,要爲生成大量文件的應用程序維護 LOG 和 TMP 文件存儲空間,可以將下列命令放入到每天運行的 cron任務中:
find $LOGDIR -type d -mtime +0 -exec compress -r {} \;
find $LOGDIR -type d -mtime +5 -exec rm -f {} \;
第一個命令找到 $LOGDIR 目錄中所有包含在 24 小時內 (-mtime +0) 進行了修改的數據的目錄(-type d), 對它們進行壓縮 (compress -r {}) 以節省磁盤空間。如果這些目錄超過了一個工作周 (-mtime +5),第二個命令則將其刪除 (rm -f {}),以便增加磁盤上的可用空間。通過這種方式,cron 任務自動地根據您所指定的時間窗口對目錄進行維護。
14,find命令之exec
exec解釋:
-exec 參數後面跟的是command命令,它的終止是以;爲結束標誌的,所以這句命令後面的分號是不可缺少的,
考慮到各個系統中分號會有不同的意義,所以前面加反斜槓。{}花括號代表前面find查找出來的文件名。
示例:
1, ls -l命令放在find命令的-exec選項中
find命令匹配到了當前目錄下的所有普通文件,並在-exec選項中使用ls -l命令將它們列出。
find . -type f -exec ls -l {} \;
2,在目錄中查找更改時間在14日以前的文件並刪除它們
find . -type f -mtime +14 -exec rm {} \;
3,在目錄中查找更改時間在5日以前的文件並刪除它們,在刪除之前先給出提示
find . -name "*.log" -mtime +5 -ok rm {} \;
4,查找文件移動到指定目錄
find . -name "*.log" -exec mv {} .. \;,
5,用exec選項執行cp命令
find . -name "*.log" -exec cp {} test3 \;
15,find -exec中使用grep命令
示例:
find命令首先匹配所有文件名爲“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然後執行grep命令看看在這些文件中是否存在一個root用戶。
find /etc -name "passwd*" -exec grep "root" {} \;
16,利用管道,
1,把find命令匹配到的文件名傳遞給xargs命令
find命令配合exec和xargs可以對所匹配到的文件執行幾乎所有的命令。
二,which:查找系統命令位置
which命令的參數:
-a:將所有由PATH目錄中可以找到的命令均列出來,而不是隻列出第一個被找到的命令。
which命令的格式: which [-a] command
which示例:
[root@176-140-17-46 ~]# which ifconfig
/sbin/ifconfig
[root@176-140-17-46 ~]#
三,whereis:程序名搜索:
whereis命令的格式:
whereis [-bmsu] 文件或目錄名
whereis命令的參數:
-b 只查找二進制格式的文件
-m 只查找在說明文件manual路徑下的文件
-s 只招source源文件
-u 查找不在上述三個選項當中的其他特殊文件
whereis 示例:
[root@176-140-17-46 ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@176-140-17-46 ~]# whereis -m ifconfig
ifconfig: /usr/share/man/man8/ifconfig.8.gz
[root@176-140-17-46 ~]#
四,locate:利用數據庫查找文件
locate 不是Linux自帶的命令,如果沒有改命令需要yum 安裝
安裝:yum -y install mlocate
安裝完使用locate定位內容,如果還報如下錯:原因是安裝完後沒有更新庫
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
解決辦法:
更新庫:updatedb
locate命令的格式:
locate [-ir] keyword
locate命令的參數:
-b, --basename 只匹配路徑名的基名
-c, --count 只輸出找到的數量
-d, --database DBPATH 使用DBPATH指定的數據庫,而不是默認數據庫 /var/lib/mlocate/mlocate.db
-e, --existing 只打印當前文件的條目
-L, --follow 檢查文件是否存在時,跟蹤符號鏈接(默認)
-h, --help 顯示幫助
-i, --ignore-case 忽略大小寫
-l, --limit, -n LIMIT 限制輸出(或計數)以限制條目
-m, --mmap 忽略,爲了向後兼容
-P, --nofollow, -H 檢查文件是否存在時,不要跟蹤符號鏈接
-0, --null 在輸出上有NUL的單獨條目
-S, --statistics 不要搜索條目,打印關於每個數據庫的統計信息
-q, --quiet 安靜模式,不會顯示任何錯誤訊息
-r, --regexp REGEXP 使用基本正則表達式
--regex 使用擴展正則表達式
-s, --stdio 忽略,爲了向後兼容
-V, --version 顯示版本信息
-w, --wholename 匹配整個路徑名(默認)
locate示例:
[root@www ~] # locate passwd
/etc/passwd
/etc/passwd-
/etc/news/passwd.nntp
/etc/pam.d/passwd
五,type:顯示指定命令的類型
type命令格式:
type [option] [commond]
type命令的參數有:
-t:輸出“file”、“alias”或者“builtin”,分別表示給定的指令爲“外部指令”、“命令別名”或者“內部指令”;
-p:如果給出的指令爲外部指令,則顯示其絕對路徑;
-a:在環境變量“PATH”指定的路徑中,顯示給定指令的信息,包括命令別名。
命令的類型可能有如下幾種:
alias: 別名;
keyword: 關鍵字,Shell保留字;
function: 函數,Shell函數;
builtin: 內建命令,Shell內建命令;
file: 文件,磁盤文件,外部命令;
unfound: 沒有找到。
type示例:
[root@176-140-17-46 ~]# type date
date is /bin/date
[root@176-140-17-46 ~]# type mysql
mysql is /usr/bin/mysql
[root@176-140-17-46 ~]# type nginx
nginx is /usr/sbin/nginx
[root@176-140-17-46 ~]# type if
if is a shell keyword
[root@176-140-17-46 ~]#