Linux-find命令學習

一、前言

??find命令用于在指定目錄下查找文件,并且搜索完成后可以執(zhí)行相應的操作,搜索時我們可以根據(jù)參數(shù)指定相應的搜索條件,比如按文件名,文件類型,時間戳等。find命令的功能特別強大,今天就來簡單學習下它的使用。

二、命令介紹

首先,我們find --help一下,可以看到find命令的格式為:

find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

好像看上去比較復雜,沒事一般的時候我們也用不到,我們來簡化一下這個格式:

find path -options[-print][-exec][-ok][...]

這里介紹下相應的參數(shù):

  • path,表示find命令所查找的目錄,比如用.來表示當前目錄,用/來表示系統(tǒng)根目錄;
  • -print,表示將查找到的文件輸出到標準輸出,如果沒有指定,默認是該模式;
  • -exec,對查找到的文件執(zhí)行該參數(shù)所給出的shell命令,相應命令的形式為'command' {} ;,注意 {} 和 \ ; 之間的空格;
  • -ok,和-exec選項功能類似,但該選項更安全,在執(zhí)行每一個命令之前,都會給出提示,讓用戶來確定是否執(zhí)行;

另外,相應的查詢參數(shù):

-name   按照文件名查找文件;
-iname  按照文件名查找,但會忽略大小寫;
-perm   按照文件權(quán)限來查找文件;
-prune  查找時忽略某目錄;

-path pattern:根據(jù)完整路徑查找文件名為pattern的文件;
-ipath:忽略大小寫;

-empty:查找文件為空而且是一個普通文件或者目錄;

-type  查找某一類型的文件,比如:
b -塊設備文件;
c -字符設備文件;
d -目錄;
p -管道文件;
f -普通文件;
l -符號鏈接文件;
s -socket文件;

-amin n   查找系統(tǒng)中最后N分鐘訪問的文件
-atime n  查找系統(tǒng)中最后n天訪問的文件
-cmin n   查找系統(tǒng)中最后N分鐘被改變文件狀態(tài)的文件
-ctime n  查找系統(tǒng)中最后n天被改變文件狀態(tài)的文件
-mmin n   查找系統(tǒng)中最后N分鐘被改變文件數(shù)據(jù)的文件
-mtime n  查找系統(tǒng)中最后n天被改變文件數(shù)據(jù)的文件

其中 -size表示按照文件大小來查找,這里來詳細說下:格式為 -size +1000n,其中n表示單位:

  • c 以字節(jié)單位;
  • b 以塊為單位,其中塊大小為512字節(jié),這個是默認單位;
  • w 以words為單位,words表示兩個字節(jié);
  • k 以1024字節(jié)為單位,也就是kilo bytes,kb;
  • M-類似,以1024*1024字節(jié)為單位,也就是Mb;
  • G-Gb;

另外,這里的前綴+-,和時間是同一個意思,加號表示查找大于給定長度的文件,減號則是表示查找小于給定長度的文件;

三、實例

接下來,我們通過一些實例來看一下find命令的使用。首先,先看下最基礎的查找模式,也就是默認是-print的模式。

1. print 標準模式
1.1 查找48小時內(nèi)修改過的文件
master@127.0.0.1:~$ find -atime -2
./.bash_profile
./.viminfo
./.viminfz.tmp
./.bash_history
./.bash_logout
1.2. 查找當前目錄下以某個格式結(jié)尾的文件
master@127.0.0.1:/logs$ find . -name "*.log"
./redis.log
./test1.log
./test2.log
./test3.log
./test4.log

由于展示結(jié)果是類似的,所以這里只列相應的命令。
1.3)查找/logs目錄下權(quán)限為 644的文件:

master@127.0.0.1:/logs$ find /log -perm 644

另外,我們在使用八進制查詢的時候,可以在八進制數(shù)字前面加一個橫杠 -,表示都匹配,如-007就相當于777,-005相當于555;
1.4)查找當目錄以.log結(jié)尾的普通文件:

master@127.0.0.1:/logs$ find . -type f -name "*.log"

1.5)查找當前所有目錄并排序:

master@127.0.0.1:/logs$ find . -type d | sort

1.6)查找當前目錄大于1k的文件:

master@127.0.0.1:/logs$ find . -size +1000c -print
.
./temp
./temp/test-master
./lib
./lib/netty-codec-4.1.14.Final.jar
./lib/spring-rabbit-2.0.1.RELEASE.jar

這里,大于與小與的查詢是可以同時使用的,如 查詢 文件大小大于2M小于10M的:

master@127.0.0.1:/logs$ find . -size +2M -size -10M -print

1.7)在/目錄下查找/start開頭并且以end結(jié)尾的文件

master@127.0.0.1:/logs$ find / -path "/start*end"

1.8)如果在查找文件時希望忽略某個目錄,我們可以使用-prune選項,但使用的時候需要注意下,因為如果同時使用了-depth選項,那么-prune選項就會被find命令忽略,如果希望在test目錄下查找文件,但不希望在test/test3目錄下查找,可以使用:

master@127.0.0.1:/logs$ find test -path "test/test3" -prune -o -print

1.9)另外,我們可以借助-printf 來打印查找到的文件的相應屬性,比如時間,大小等;

master@127.0.0.1:/logs$ find -type f -printf '%T+%p \n'
2019-06-10+16:18:39.8681443600./logs/test2.log

有關更多printf,可以參考:http://man.he.net/man1/find,然后搜索 **printf **,即可看到所有的選項。

2. exec 與ok 模式

如果只是查找的話,上面的這些查詢已經(jīng)夠我們平時用了,不過我們有時候不僅僅是只查找一下,可能還會有后綴的操作,這個時候就要使用-exec模式了。

-exec后面跟的是shell命令,表示查詢出對應的文件后進行其他命令操作。該模式結(jié)束是以 ; 為標志的,所以這句命令后面的分號是不可缺少的,考慮到各個系統(tǒng)中分號會有不同的意義,所以前面會加反斜杠。

該命令格式一般為:

find path -exec command' {} \;

首先是exec選項,后面是要執(zhí)行的命令或腳本,然后是一對{ },一個空格和一個\,最后是一個分號。其中花括號代表前面find查找出來的文件名;

2.1 查看并列出對應文件:
master@127.0.0.1:/logs$ find . -type f -exec ls -l {} \;

要注意末尾的花括號與斜杠之間的空格;

2.2 查找并刪除修改時間在2天以前的文件:
master@127.0.0.1:/logs$ find . -type f -mtime +2 -exec rm {} \; 

在任何刪除之前,都應該先查看相應的文件,以免進行誤刪除操作;而 -ok 選項則可以看作是exec的安全模式,它會在刪除前提示你進行確認:

master@127.0.0.1:/logs$ find . -name "*.log" -ok rm {} \; 
< rm ... ./test2.log > ? y

它會在刪除前進行確認,按y鍵進行刪除,按n鍵取消刪除;

2.3 查找文件并查找文件中的內(nèi)容:

任何形式的命令都可以在exec選項中使用,這里我們可以使用grep來配合find命令:

master@127.0.0.1:/logs$  find /test -name "passwd*" -exec grep "root" {} \;

這里首先查找所有文件名以“passwd”開頭的文件,然后執(zhí)行grep命令看看在這些文件中是否存在一個root用戶。

2.4 查找并復制文件到指定目錄:

另外如果查找后移動或者復制文件到某個目錄下的話,新的目錄在花括號后指定,如:

master@127.0.0.1:/logs$ find . -name "*.log" -exec cp {} test3 \;

四、總結(jié)

當然除了這幾種模式外,還有其他的模式,比如-execdir,-okdir等,等用到的時候再回來更新吧。

本文參考自:
每天一個linux命令(22):find 命令的參數(shù)詳解
https://www.cnblogs.com/peida/archive/2012/11/15/2770888.html
http://man.he.net/man1/find
Linux中find命令使用-linux.cn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容