史上最全-find命令詳解


find是linux下最棒的命令之一,其查詢功能非常強大。以下將詳細介紹find的大多數用法:
工作方式:其沿着文件層次結構向下遍歷,匹配符合條件的文件,並執行相應的操作。

1.打印文件和目錄列表

# find . -print   #打印文件和目錄列表

當使用-print時,’\n’作為用於分隔文件的定界符。
-print0指明使用’\0’作為定界符來打印匹配的每一個文件名。此方法對於文件名中含有’\n’是非常有效。
但在centos上經實際測試,find直接顯示匹配到的文件,不需要加上-print選項。
2.根據文件名或正則表達式匹配搜索
選項-name指定了文件名所必須配皮的字符串.

# find . -name "*.txt"     # 打印以.txt結尾的文件
# find . -iname "*.txt"    #-iname表示匹配的文件名忽略大小寫
# find . -name "[A-Z]*"    #想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件
# find . -name "[a-z]*[4-9].log"  #當前目錄查找文件名以一個個小寫字母開頭,最后是4到9加上.log結束的文件

3.條件限制,匹配多個條件中的一個
-a:表示且
-o:表示或
-not:表示非

# find . \( -name "*.txt" -o -name "*.pdf" \)    #打印當前目錄下以.txt或.pdf結尾的文件
# find . \( -name "*.txt" -a -name "a*" \)       #打印當前目錄下以a開頭且以.txt結尾的文件
# find . -not \( -name "*.txt" -a -name "a*" \)  #打印當前目錄下不以a開頭或不以.txt結尾的文件
# find . -not \( -name "*.txt" -o -name "a*" \)  #打印當前目錄下不以a開頭qie不以.txt結尾的文件

-not用法源於德摩根定律

-path:此參數用於將文件路徑作為一個整體進行匹配。

# find /home/user -path "*sh"
  /home/user/bin/1.sh
  /home/user/bash

-regex :此參數與-path類似,只不過其是基於正則表達式來匹配文件路徑的。
# find . -regex ".*\( \.py \| \.sh \)$"

4.否定參數
find也可以用“!”作為否定參數。

# find . ! -name ".txt"   #匹配所有不以.txt結尾的文件

5.基於目錄的深度搜索
find命令在用時會遍歷所有的子目錄,我們可以采用一些參數來限制其遍歷的深度。

-maxdepth:最大深度限制,1表示只在當前目錄,2表示向下兩級
# find . -maxdepth 1 -type f     #只列出當前目錄下的所有普通文件

-mindepth:最小深度限制,與上面用法相似。
# find . -mindepth 2 -type f    #列出距當前目錄至少兩個子目錄的所有文件

6.根據文件類型搜索
linux下的文件類型

文件類型  類型參數
普通文件 f
符號文件 l
目錄 d
字符設備 c
塊設備 b
套接字 s
Fifo(管道文件) p

 

 

 

 

 

 

 

 

 

# find . -type f
# find . -type d

7.根據文件時間進行搜索
linux文件系統中的每個文件都有三種時間戳:
訪問時間(atime——access time):就是上次訪問這個文件的時間。
改變時間(ctime——change time):就是文件的inode改變的時間(什么是inode?)當你往一個文件中添加數據或者刪除數據的時候,修改文件所有者的時候,鏈接改變的時候,文件的ctime就會發生改變。
修改時間(mtime——modification time):就是文件的內容上一次發生改變的時候的時間。
-atime,-ctime,-mtime可作為find的時間參數。單位是天,這些值通常還帶有+或-:+表示大於,-表示小於。​​​​​​​

# find . -type f -atime -7   #打印7天內被訪問的文件
# find . -type f -atime  7   #打印恰好在7天前被訪問的文件
# find . -type f -atime +7   #打印超過7天沒被訪問的文件

上面的時間都是基於“天”,還有基於“分鍾”的。
-amin
-mmin
-cmin
用法與上相似,再次就不舉例了。


find的另一個漂亮的特性是-newer參數,我們可以指定一個用於比較時間戳的參考文件,然后找出比參考文件更新的所有文件。

# find . -type f -newer file.txt

8.基於文件大小的搜索

-size:用法與上相似
# find . -type f -size +2k                   #查找大於2k的文件
# find . -type f -size 2k                   #查找等於2k的文件
# find . -type f -size -2k                   #查找小於2k的文件

除了k之外,還有其他文件大小單元
b——塊(512字節)。
c——字節。
w——字。
k——千字節。
M——兆字節。
G——吉字節。


9.刪除匹配的文件

-delete參數可以實現此功能。
# find . -type f -name "*.swp" -delete

10.基於文件權限和所有權進行匹配

最好使用八進制的權限表示法
-perm:
# find . -type f -perm 644     # 打印出權限為644的文件

-user:后可解用戶名或uid
# find . -type f -user root    # 打印root用戶所擁有的文件

11.結合find執行命令或動作

-exec:此參數是find最強大的參數之一。
# find . -type f -name "*.c" -exec cat {} \; > file.txt  #將所有c程序拼接起來寫入單個文件file.txt中
# find . -type f -mtime +10 -name "*.txt" -exec cp {} /tmp \;    #將10天前的.txt文件復制到/tmp下

注:{}表示匹配到的文件。

12.讓find跳過特定的目錄

在使用-prune選項時要當心,因為如果你同時使用了-depth選項,那么-prune選項就會被find命令忽略。
# find  . \(-name ".git" -prune \) -o \( -type f -print \)

解釋:圓括號表示表達式的結合。  \ 表示引用,即指示 shell 不對后面的字符作特殊解釋,而留給 find 命
令去解釋其意義。

13.find與xargs結合使用

xargs:將標准輸入轉換成命令行參數。
# find . -type f -name "*.txt" -print0 |xargs  -0 rm -f   #將匹配到的文件刪除,xargs -0將 \0作為輸入定界符。
# find . -type f -name "*.c" -print0 | xargs  -0wc -l     #統計所有c程序文件的行數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM