每天一個linux命令:find

每天一個linux命令:find

1.命令功能

find 命令用來在指定目錄下查找文件。如果使用該命令時,不設置任何參數,則 find 命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。

更多精彩請關注:www.zicreate.com

2.命令格式

find [選項] [參數]

3.命令參數

-amin<分鐘>:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算;
-anewer<參考文件或目錄>:查找其存取時間較指定文件或目錄的存取時間更接近現在的文件或目錄;
-atime<24小時數>:查找在指定時間曾被存取過的文件或目錄,單位以24小時計算;
-cmin<分鐘>:查找在指定時間之時被更改過的文件或目錄;
-cnewer<參考文件或目錄>查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
-ctime<24小時數>:查找在指定時間之時被更改的文件或目錄,單位以24小時計算;
-daystart:從本日開始計算時間;
-depth:從指定目錄下最深層的子目錄開始查找;
-expty:尋找文件大小爲0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄;
-exec<執行指令>:假設find指令的回傳值爲True,就執行該指令;
-false:將find指令的回傳值皆設爲False-fls<列表文件>:此參數的效果和指定“-ls”參數類似,但會把結果保存爲指定的列表文件;
-follow:排除符號連接;
-fprint<列表文件>:此參數的效果和指定“-print”參數類似,但會把結果保存成指定的列表文件;
-fprint0<列表文件>:此參數的效果和指定“-print0”參數類似,但會把結果保存成指定的列表文件;
-fprintf<列表文件><輸出格式>:此參數的效果和指定“-printf”參數類似,但會把結果保存成指定的列表文件;
-fstype<文件系統類型>:只尋找該文件系統類型下的文件或目錄;
-gid<羣組識別碼>:查找符合指定之羣組識別碼的文件或目錄;
-group<羣組名稱>:查找符合指定之羣組名稱的文件或目錄;
-help或——help:在線幫助;
-ilname<範本樣式>:此參數的效果和指定“-lname”參數類似,但忽略字符大小寫的差別;
-iname<範本樣式>:此參數的效果和指定“-name”參數類似,但忽略字符大小寫的差別;
-inum<inode編號>:查找符合指定的inode編號的文件或目錄;
-ipath<範本樣式>:此參數的效果和指定“-path”參數類似,但忽略字符大小寫的差別;
-iregex<範本樣式>:此參數的效果和指定“-regexe”參數類似,但忽略字符大小寫的差別;
-links<連接數目>:查找符合指定的硬連接數目的文件或目錄;
-iname<範本樣式>:指定字符串作爲尋找符號連接的範本樣式;
-ls:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出;
-maxdepth<目錄層級>:設置最大目錄層級;
-mindepth<目錄層級>:設置最小目錄層級;
-mmin<分鐘>:查找在指定時間曾被更改過的文件或目錄,單位以分鐘計算;
-mount:此參數的效果和指定“-xdev”相同;
-mtime<24小時數>:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;
-name<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
-newer<參考文件或目錄>:查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
-nogroup:找出不屬於本地主機羣組識別碼的文件或目錄;
-noleaf:不去考慮目錄至少需擁有兩個硬連接存在;
-nouser:找出不屬於本地主機用戶識別碼的文件或目錄;
-ok<執行指令>:此參數的效果和指定“-exec”類似,但在執行指令之前會先詢問用戶,若回答“y”或“Y”,則放棄執行命令;
-path<範本樣式>:指定字符串作爲尋找目錄的範本樣式;
-perm<權限數值>:查找符合指定的權限數值的文件或目錄;
-print:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲每列一個名稱,每個名稱前皆有“./”字符串;
-print0:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲全部的名稱皆在同一行;
-printf<輸出格式>:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式可以自行指定;
-prune:不尋找字符串作爲尋找文件或目錄的範本樣式;
-regex<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:將find指令的回傳值皆設爲True-typ<文件類型>:只尋找符合指定的文件類型的文件;
-uid<用戶識別碼>:查找符合指定的用戶識別碼的文件或目錄;
-used<日數>:查找文件或目錄被更改之後在指定時間曾被存取過的文件或目錄,單位以日計算;
-user<擁有者名稱>:查找符和指定的擁有者名稱的文件或目錄;
-version或——version:顯示版本信息;
-xdev:將範圍侷限在先行的文件系統中;
-xtype<文件類型>:此參數的效果和指定“-type”參數類似,差別在於它針對符號連接檢查。

4.使用場景

列出本目錄下所有的文件和目錄:

$ find .

在/home目錄下查找以.txt結尾的文件名

$ find /home -name “*.txt” 如果要忽略大小寫用 -iname

當前目錄及子目錄下查找所有以.txt和.bz2結尾的文件

$ find ./ -name "*.bz2" -o -name "*.txt"         小寫字母o=or
./joke.txt
./test/test.txt.bz2
./zicreate.txt

當前目錄及子目錄下查找所有包含txt 同時以.bz2結尾的文件

$ find ./ -name "*.bz2" -a -name "*txt*"       小寫字母a=and
./test/test.txt.bz2
$ find ./ -name "*txt*.bz2"
./test/test.txt.bz2

匹配文件路徑或者文件(如果只匹配路徑改成”*local/*”)

$ find /usr/ -path “*local*”

基於正則表達式匹配文件路徑

$ find . -regex “.*(.txt|.bz2)$” 忽略大小寫用-iregex

當前目錄及子目錄下查找所有不包含txt 同時不以.bz2結尾的文件

$ find ./ ! -name “*.bz2” -a ! -name “*txt*” 小寫字母a:and

根據文件類型進行搜索

$ find . -type 類型參數

類型參數列表:
>
f 普通文件
l 符號連接
d 目錄
c 字符設備
b 塊設備
s 套接字
p Fifo

查找以unix結尾的目錄

$ find . -type d -name "*unix"
./.font-unix
./.ICE-unix

基於目錄深度搜索
向下最大深度限制爲3,查找db文件

$ find . -maxdepth 3 -type f -name "*.db"
./database.db

搜索出深度距離當前目錄至少2個子目錄的所有文件

$ find . -mindepth 2 -type f

根據文件時間戳進行搜索

$ find . -type f 時間戳

UNIX/Linux文件系統每個文件都有三種時間戳:

  • 訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。
  • 修改時間(-mtime/天,-mmin/分鐘):文件最後一次修改時間。
  • 變化時間(-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最後一次修改時間。

搜索最近七天內被訪問過的所有文件(< 7 days)

$ find . -type f -atime -7

搜索恰好在七天前被訪問過的所有文件(=7th day)

$ find . -type f -atime 7

搜索超過七天內被訪問過的所有文件(> 7 days)

$ find . -type f -atime +7

搜索訪問時間超過10分鐘的所有文件

$ find . -type f -amin +10

找出比file.log修改時間更長的所有文件

$ find . -type f -newer file.log

根據文件大小進行匹配

$ find . -type f -size 文件大小單元

文件大小單元:

b —— 塊(512字節)
c —— 字節
w —— 字(2字節)
k —— 千字節
M —— 兆字節
G —— 吉字節

搜索大於10KB的文件

$ find . -type f -size +10k

搜索小於10KB的文件

$ find . -type f -size -10k

搜索等於10KB的文件

$ find . -type f -size 10k

刪除匹配文件

刪除當前目錄下所有.txt文件

$ find . -type f -name "*.txt" -delete
or
$ find . -type f -name "*.txt" -exec rm {} \;

根據文件權限/所有權進行匹配

當前目錄下搜索出權限爲777的文件

$ find . -type f -perm 777

找出當前目錄下權限不是644的sh文件

$ find . -type f -name “*.sh” ! -perm 644

找出當前目錄用戶zicreate擁有的所有文件

$ find . -type f -user zicreate

找出當前目錄用戶組admin擁有的所有文件

$ find . -type f -group admin

藉助-exec選項與其他命令結合使用

刪除當前目錄下所有.txt文件

    $ find . -type f -name "*.txt" -delete
    or
    $ find . -type f -name "*.txt" -exec rm {} \;
    or
    $ find . -type f -name "*.txt" -ok rm {} \;

    ok和-exec行爲一樣,不過它會給出提示,是否執行相應的操作。

上例中,’{}’ 代表 find 找到的結果,-exec 選項結合使用來匹配所有文件,’{}’與’\;’之間有空格。

查找當前目錄下所有.txt文件並把他們拼接起來寫入到all.txt文件中

$ find . -type f -name “*.txt” -exec cat {} \;> all.txt

將30天前的.log文件移動到old目錄中

$ find . -type f -mtime +30 -name “*.log” -exec mv {} old \;

找出當前目錄下所有.txt文件並以“File:文件名”的形式打印出來

$ find . -type f -name “*.txt” -exec printf “File: %s\n” {} \;

因爲單行命令中-exec參數中無法使用多個命令,以下方法可以實現在-exec之後接受多條命令

$ find . -type f -name “*.txt” -exec ./text.sh {} \;

搜索但跳過指定的目錄

查找當前目錄或者子目錄下所有.txt文件,但是跳過子目錄skip

$ find . -path “./skip” -prune -o -name “*.txt” -print

要列出所有長度爲零的文件

$ find . -empty

find 的 exec 及 ok 命令補充說明:

exec 命令的格式爲: exec command {} \;

exec 後面跟着的是操作命令,然後跟着“{}”表示每一個參數,然後空格,然後“\;”。“{}”之後一定要跟一個空格,exec命令以‘;‘作爲結束,爲了表名 ‘;’ 只是一個結束符,使用轉義字符 ‘\’ 加在’;’前面。
如下用’;’分割兩個命令序列:

$ find ./ -iname “.c” -exec echo {} \; -or -iname “*.py” -exec echo {} \;

ok命令和exec作用相同,唯一的區別在於ok是exec命令的安全模式,在執行command之前會給出提示。

擴展

(1) xargs

使用 xargs 命令可以替換 -exec ,詳解如下:

xargs 命令需要結合管道符 ’|‘ 使用,其格式爲:cmd1 | xargs cmd2
命令執行結果對比:

$ find . -type f -atime +7 | xargs echo {}
./all.tar.gz ./www/test_thread.c  ./www/cpu_busy_idle.c ./zicreate.txt
$ find . -type f -atime +7 -exec echo {} \;
./all.tar.gz
./www/test_thread.c
./www/thread_busy_idle.c
./zicreate.txt

以上面的命令可以看出:exec命令是將find到的每個參數都執行了一次命令;而 xargs 在默認狀態下是將 find 到的所有的參數當作一個參數處理,僅執行了一次命令。 如果要 xargs 與 -exec 一樣的執行方式,需要添加參數‘-i’:

$ find . -type f -atime +7 | xargs -i echo {}

總結:
find的exec命令將爲每一個參數單獨執行一條命令;xargs命令將使用一條命令處理所有的參數;故效率上xargs會高。但是當遇到參數中存在空格時,xargs命令會出錯,此時只能使用-i命令處理每一個參數。

xargs

xargs命令是給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。它擅長將標準輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令參數。xargs也可以將單行或多行文本輸入轉換爲其他格式,例如多行變單行,單行變多行。xargs的默認命令是echo,空格是默認定界符。這意味着通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。xargs是構建單行命令的重要組件之一。

關於 xargs 更深入的分析可以參考:http://www.cnblogs.com/f-ck-need-u/p/5925923.html

前期文章我們將 cat 命令時講過一條命令:ls xa* | xargs -i mv {} {}.bin
今天我們又遇到了相似的命令:find . -type f -atime +7 -exec echo {} \;

空的大括號”{}”是什麼意思呢?!!!

Linux中(Bash)shell的空的大括號”{}”,是佔位符的含義。

對於 find,ls 等輸出一個列表的命令,”{}” 代表依次循環的每一個;

參考:

Unable to understand the syntax of the command find

後期文章將對Linux中(Bash)shell的各種特殊符號進行一個專門的總結,敬請關注。

(2)五種查詢命令

Linux的查找命令有5個,分別如下:

  • find:最常用和最強大的查找命令,可以用它找到任何想找的文件。
  • which:在PATH變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果;
    $ which find
    /usr/bin/find
    $ which test.tar
    /usr/bin/which: no test.tar in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin)
  • type:用於區分某個命令到底是由shell自帶的,還是由shell外部的獨立二進制文件提供的。如果一個命令是外部命令,那麼使用-p參數,會顯示該命令的路徑,相當於which命令。type命令其實不能算查找命令;
    $ type find
    find is hashed (/usr/bin/find)
    $ type test
    test is a shell builtin
    $ type -p find
    /usr/bin/find


  • whereis:只能用於程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s),和find相比,whereis查找的速度非常快,這是因爲linux系統會將 系統內的所有文件都記錄在一個數據庫文件中,當使用whereis和下面即將介紹的locate時,會從數據庫中查找數據,而不是像find命令那樣,通 過遍歷硬盤來查找,效率自然會很高;


    $ whereis find
    find: /usr/bin/find /usr/share/man/man1/find.1.gz

  • locate和slocate都用來查找文件或目錄,相當於find -name,可快速查找文件;原因在於它不搜索具體目錄,而是搜索一個數據庫/var/lib/locatedb,這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,並且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。爲了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。由於我們查找文件時基本上都知道文件的大概位置,所,這個命令並沒有find使用的頻繁。

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