linux命令之文件查找類

前言

Linux常用命令中,有些命令可以幫助我們查找二進制文件,幫助手冊或源文件的位置,也有的命令可以幫助我們查找磁盤上的任意文件,今天我們就來看看這些命令如何使用。

一、Linux命令文件查找

which

which -a which  #查看命令which所在位置,-a參數表示找出所有

[root@localhost xws]# which -a which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
	/usr/bin/alias
	/bin/alias
	/usr/bin/which
/usr/bin/which
/bin/which

which命令會在PATH變量指定的路徑中,搜索某個系統命令的位置。例如:
PATH變量有哪些內容呢?我們來看一下(不同電腦可能不同):

[root@localhost xws]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/xws/.local/bin:/home/xws/bin

PATH環境變量存放着一些路徑信息,例如/usr/bin,當你在shell終端敲入一個命令,但是在PATH中包含的路徑下沒有時並且也不是內置命令時,就會提示:command not found。

當你已經安裝了一個命令,但是使用時卻提示找不到該命令,可以查看該環境變量,是否有你安裝命令的路徑。

所以是不是明白了爲什麼有些命令或程序需要添加環境變量才能直接使用了吧?

whereis

whereis命令用於搜索程序的二進制文件,源代碼文件或幫助文檔。例如:

[root@localhost xws]# whereis ls  #如果上述三者有,則三者都會顯示。
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

[root@localhost xws]# whereis -m ls #只查看ls的幫助手冊
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

[root@localhost xws]# whereis -b ls   #只查找ls的二進制文件
ls: /usr/bin/ls
[root@localhost xws]# whereis stdio.h  #查找stdio.h頭文件,和幫助手冊
stdio: /usr/include/stdio.h /usr/share/man/man3/stdio.3.gz

同樣地,它不能查找到內置命令。

type

type用於查看命令類型,一般有以下類型:

alias:別名
keyword:關鍵字
builtin:內置命令
file:外部命令

而常見參數如下:

-t 輸出類型名,如file
-p 如果是外部命令,則顯示其所在路徑
-a 對於外部命令,它會顯示命令路徑,命令類型等信息

我們來看幾個例子:

[root@localhost xws]# type ls #ls是一個別名
ls is aliased to `ls --color=auto'

[root@localhost xws]# type cd  #cd是一個內置命令
cd is a shell builtin

[root@localhost xws]# type find
find is /usr/bin/find
[root@localhost xws]# type function #function是一個shell關鍵字
function is a shell keyword
[root@localhost xws]# type -a which  #顯示所有路徑
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
which is /usr/bin/which
which is /bin/which

locate

前面所說的命令都限於查找命令,幫助手冊或源文件,而locate用於快速查找任何文件。它從一個系統數據庫進行文件查找,而不需要遍歷磁盤,因此速度極快。通常該系統數據庫每天更新一次(可以查看系統的/etc/cron.daily/mlocate,不同系統可能不一樣)。
常見選項如下:

參數 功能描述
-e 僅查找存在的文件
-q 安靜模式,不會顯示任何錯誤訊息
-n 至多顯示 n個輸出
-r 使用正規運算式
-i 查找忽略大小寫
-c 打印匹配結果數量

爲了演示,我造了幾個演示的文件,假設當前目錄早已存在以下文件:

  • locate.txt locate.log LOCATE.zip

實例

快速查找文件

locate locate.txt
/home/xws/test/locate.txt

locate命令其實是“find -name”的另一種寫法,但是要比後者快得多,原因在於它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,並且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。爲了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。
在這裏插入圖片描述

locate locate.txt  #查找之前刪除locate.txt
#雖然文件不存在,但是仍然被查找出來
locate -e locate.txt  #-e參數可以查找只存在的文件
(由於該文件不存在,因此也不會被查找出來)
locate -c locate.log #只計算查找到的數量
 1

忽略大小寫查找

locate -i locate.zip #忽略大小寫
/home/xws/test/LOCATE.zip
/home/xws/test/locate.zip

使用正則表達式

普通的查找是模糊匹配的,因此只要目標名稱中包含要搜索的名稱,都會被搜索出來,但是我們可以利用正則表達式,來精確查找。

locate -r /locate.log$  #查找以/locate.log結尾的文件 
/home/xws/locate.log
/home/xws/test/locate.log

find

find命令是linux下一個強大的查找命令。與locate命令相比,它需要遍歷磁盤文件,因此查找速度較慢,但正因如此,它的實時性比locate好得多。另外一方面,find命令的查找條件比locate豐富得多。

以名稱爲條件

最常用的恐怕就是以文件名爲條件了,涉及參數-name,-iname,例如:
當前目錄下查找以locate開頭的文件:

[root@localhost test]# find ./ -name "locate*"
./locate.log
./locate.txt
./locate.zip

find ./ -iname "locate.txt" #忽略大小寫

以權限爲條件

有時候需要查找特定權限的文件,可以使用-perm參數,例如查找當前目錄下權限爲777的文件:

find ./ -perm 777

以文件類型爲條件

涉及參數-type,例如要查找當前目錄下的符號鏈接文件:

find ./ -type l #l是符號鏈接

主要類型有:

f 普通文件
d 目錄
b 塊設備文件
c 字符設備文件
l 符號鏈接
s 套接字
p 管道文件

以文件大小爲條件

涉及參數-size,例如:

find ./ -size 1k  #查找當前目錄下小於1k的文件

find ./ -size +1M  #查找當前目錄下大於1M的文件

常用單位有:

k 千字節
M 兆字節
G 吉字節
c 字節
b 塊,一般爲512字節
w 字大小,兩個字節

以歸屬爲條件

涉及參數-user,-nouser,-group,-nogroup等,例如

find ./ -user root  #查找當前目錄下root用戶的文件
find ./ -nouser   #查找當前目錄下root用戶的被刪除的文件

-group,-nogroup類似的用法,只不過條件是用戶組。

以時間爲條件

涉及參數-mtime,-atime,-ctime,-newer,-anewer,-cnewer,-amin,-cmin等,例如:

find ./ -mtime 3 #查找3天前更改過的文件
find ./ -mtime -3 #查找3天內更改過的文件
find ./ -mtime 0 #查找今天更改過的文件
find ./ -newer sort.txt #查找比sort.txt修改時間更新的文件
find ./ -anewer sort.txt #查找比sort.txt訪問時間更新的文件
find ./ -amin  5 #查找5分鐘之前訪問過的文件

注:

  • atime 最後訪問時間
  • mtime 最後修改時間
  • ctime 最後修改時間,這裏包括屬性和權限
  • find命令的查找條件比較多,而其用法也非常豐富,本文僅簡單介紹,後面的文章將會介紹find的一些高級用法。

總結

\color{red}{\diamondsuit} which命令可用於查找命令位置。
\color{red}{\diamondsuit} whereis可查找命令的位置,手冊,源文件等。
\color{red}{\diamondsuit} which和whereis都不能查找內置命令位置。
\color{red}{\diamondsuit} locate優點:查找速度塊;缺點:模糊匹配,匹配路徑,實時性差。
\color{red}{\diamondsuit} find優點:準確查找,功能豐富;缺點:速度較慢。

二、find命令高級用法

查找空文件或空目錄

有時候需要清理一些空的文件或者文件夾。這個時候就需要先找到它們。

1.查找空文件

我們利用之前介紹過的size參數,例如:

find ./ -size 0 #查找當前目錄下大小爲0的文件

當然也可以利用-empty參數,例如:

find -type f -empty # -type f指明瞭要查找的是文件

2.查找空目錄

查找空目錄只需要利用-empty參數即可。例如:

find -type d -empty #d -> directory文件夾

查找出這些空文件或者文件夾,通常要對其進行處理,最常見的操作就是刪除。如何刪除呢?我們後面再說。

查找時排除文件或目錄

1.查找時排除文件

例如,我們按照名字查找某一類文件,但是又不想找到其中的.log文件時,可以使用!邏輯運算符查找,例如:

find ./ -name "*locate*" ! -name "*zip"

2.查找時排除目錄

我們在查找某些文件時,可能已經知道某個目錄有,但又不想浪費時間再次查找,可以使用-prune參數和-path參數,例如:

find .  -path ./test -prune -o -name "*.txt"

這裏查找txt文件,但是排除test目錄下的txt文件。但是注意./test不能寫成./test/,否則結果將不正確。測試的時候,發現./test仍然會出現在查找結果中。另外-prune不要和-depth(-delete)一起使用,否則-prune將不起作用。

如果需要排除多個目錄呢?

find ./ \( -path "./test" -o -path "./home" \) -prune -o -name "*.txt"

注意,這裏(和\)前後都有空格。它是告訴shell後面的字符不解釋,讓find命令自己解釋其作用。

當然了,排除目錄還可以使用!邏輯符號。例如:

find ./ \( -path "./test" -o -path "./home" \) -prune -o -name "*.txt"

注意,這裏(和\)前後都有空格。它是告訴shell後面的字符不解釋,讓find命令自己解釋其作用。

當然了,排除目錄還可以使用!邏輯符號。例如:

find ./ -name "*.txt" ! -path "./test"

對查找到的文件執行命令操作

在查找到文件之後,我們可能需要對它進行操作,例如刪除,移動等。我們可以利用xargs。例如:

find -name "*.log" |xargs rm -f #找到.log文件後,刪除
find -name "*test" |xargs chmod 755 #將找到文件的權限修改爲755
find -name "*test" |xargs grep "hello" #查找包含hello字符串的test文件

在這裏插入圖片描述
xargs後面跟的是要執行的命令,這裏只是簡單舉例。

我們還可以利用**-exec**參數。例如:

find ./ -name "*txt"  -exec rm -f {} \;#找到後刪除
find ./ -name "*txt"  -exec cp {} ./test \;#找到後複製至test目錄下

這裏的{}指代了查找到的內容。;作爲命令參數結束的標誌,因此是必要的,記得要加上分號";"。提醒一下,刪除需謹慎,都是淚啊。rm 帶上-i參數,可進行交互式刪除,即需要詢問。
在這裏插入圖片描述
我們也可以利用**-ok**參數,它與-exec的差別在於,它會詢問用戶,很適合用於刪除:

find ./ -name "*.log" -ok ls -al {} \;
< ls ... ./locate/locate.log > ? 

find . -name "*.txt" -ok rm {} \; #刪除1.txt
< rm ... ./locate.txt > ? n
< rm ... ./1.txt > ? y

在這裏插入圖片描述
刪除查找到的文件

除了前面介紹的利用xargs和exec刪除文件之外,還可以利用-delete參數。例如:

find ./ -name "*.log" -delete #刪除以log爲後綴的文件

多條件組合查找

在前面其實我們已經看到了條件組合的使用。
常用的條件組合參數有 -a(and),-o(or),!(not)。我們來看幾個實例:
實例1.查找普通文件和符號鏈接文件:

find ./ -type f -o -type l #查找普通文件和符號鏈接文件

實例2.在當前目錄下查找zip包和gz包:

find ./ -name "*.zip" -o -name "*.gz"

實例3.查找名爲test的符號鏈接文件:

find ./ -name "*test" -a -type l

實例4.查找log文件以外的文件:

find ./ ! -name "*.log"

以上幾個實例簡單介紹了條件的組合使用。更豐富的用法可以自行探索。

查找比某文件新或某文件舊的文件

環境上日誌文件太多,想刪除某個時間之前的文件,該怎麼處理?
可以利用以下參數:

  • newer 修改時間更新的
  • anewer 訪問時間更新的
  • ctime 修改時間更新的,包括屬性的修改
find ./ ! -newer 1.log |xargs ls -al #列出比1.log更舊的文件
find ./  -newer 1.log |xargs ls -al #列出比1.log更新的文件

這裏我只是列出,並沒有刪除,刪除可參考前面介紹的刪除找到的文件。而如果要查找出比文件1更新,比文件2舊的文件,只需要利用組合條件即可。

查找結果以特定格式輸出

前面的多數查找結果只是列出路徑和文件名,如何獲取更多信息呢?當然我們可以利用xargs或者exec,結合ls -al獲取文件的更多信息,但是我們還有更好的方法。例如,將查找到的log文件的文件名,訪問時間,權限信息,大小等信息輸出:

find ./ -name "*.log" -printf "%f %a %M %s\n"

locate.log Sat Nov 24 09:44:22.3078519090 2018 -rw-rw-r-- 69
test.log Sat Dec 15 15:09:33.9905929210 2018 -rw-rw-r-- 0

常見的格式控制輸出如下:

參數 功能
%f 文件名
%a 訪問時間
%c 修改時間
%M 權限信息
%m 權限位信息
%s 文件大小,單位爲字節
%d 文件所在目錄層級
%u 文件所屬用戶
%p 帶相對路徑的完整名
%y 文件類型

轉載自公衆號【編程珠璣】
原文出處find命令高級用法
Linux中的文件查找技巧

作者總結的挺不錯的,可以關注一下,反正我關注了哈哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章