find是linux下最棒的命令之一,其查詢功能非常強大。以下將詳細介紹find的大多數用法:
工作方式:其沿著文件層次結構向下遍歷,匹配符合條件的文件,並執行相應的操作。
-
-
1.打印文件和目錄列表
-
$find . -print #打印文件和目錄列表
當使用-print時,’\n’作為用於分隔文件的定界符。 -print0指明使用’\0’作為定界符來打印匹配的每一個文件名。此方法對於文件名中含有’\n’是非常有效。 但在centos上經實際測試,find直接顯示匹配到的文件,不需要加上-print選項。 2.根據文件名或正則表達式匹配搜索 選項-name指定了文件名所必須配皮的字符串.
-
-
$find . -name "*.txt" -print # 打印以.txt結尾的文件
-
$find . -iname "*.txt" -print #-iname表示匹配的文件名忽略大小寫
3.條件限制,匹配多個條件中的一個 -a:表示且 -o:表示或 -not:表示非
-
-
$find . \( -name "*.txt" -o -name "*.pdf" \) -print #打印當前目錄下以.txt或.pdf結尾的文件
-
$find . \( -name "*.txt" -a -name "a*" \) -print #打印當前目錄下以a開頭且以.txt結尾的文件
-
$find . -not \( -name "*.txt" -a -name "a*" \) -print #打印當前目錄下不以a開頭或不以.txt結尾的文件
-
$find . -not \( -name "*.txt" -o -name "a*" \) -print #打印當前目錄下不以a開頭qie不以.txt結尾的文件
-not用法源於德摩根定律,詳見http://zh.wikipedia.org/wiki/%E5%BE%B7%E6%91%A9%E6%A0%B9%E5%AE%9A%E5%BE%8B
-path:此參數用於將文件路徑作為一個整體進行匹配。
-
-
$find /home/user -path "*sh" -print
-
/home/user/bin/1.sh
-
/home/user/bash
-
-regex :此參數與-path類似,只不過其是基於正則表達式來匹配文件路徑的。
-
$find . -regex ".*\( \.py \| \.sh \)$"
4.否定參數 find也可以用“!”作為否定參數。
-
-
$find . ! -name ".txt" -print #匹配所有不以.txt結尾的文件
5.基於目錄的深度搜索 find命令在用時會遍歷所有的子目錄,我們可以采用一些參數來限制其遍歷的深度。
-
-
-maxdepth:最大深度限制,1表示只在當前目錄,2表示向下兩級。。。。。。
-
$find . -maxdepth 1 -type f -print #只列出當前目錄下的所有普通文件
-
-mindepth:最小深度限制,與上面用法相似。
-
$find . -mindepth 2 -type f -print #列出距當前目錄至少兩個子目錄的所有文件
6.根據文件類型搜索 linux下的文件類型 文件類型 類型參數 普通文件 f 符號文件 l 目錄 d 字符設備 c 塊設備 b 套接字 s Fifo(管道文件) p
-
-
$find . -type f -print
-
$find . -type d -print
7.根據文件時間進行搜索 linux文件系統中的每個文件都有三種時間戳: 訪問時間(atime——access time):就是上次訪問這個文件的時間。 改變時間(ctime——change time):就是文件的inode改變的時間(什麼是inode?)當你往一個文件中添加數據或者刪除數據的時候,修改文件所有者的時候,鏈接改變的時候,文件的ctime就會發生改變。 修改時間(mtime——modification time):就是文件的內容上一次發生改變的時候的時間。 -atime,-ctime,-mtime可作為find的時間參數。單位是天,這些值通常還帶有+或-:+表示大於,-表示小於。
-
-
$find . -type f -atime -7 -print #打印7天內被訪問的文件
-
$find . -type f -atime 7 -print #打印恰好在7天前被訪問的文件
-
$find . -type f -atime +7 -print #打印超過7天沒被訪問的文件
上面的時間都是基於“天”,還有基於“分鐘”的。 -amin -mmin -cmin 用法與上相似,再次就不舉例了。 find的另一個漂亮的特性是-newer參數,我們可以指定一個用於比較時間戳的參考文件,然後找出比參考文件更新的所有文件。
-
-
$find . -type f -newer file.txt -print
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 -print #打印出權限為644的文件
-
-user:後可解用戶名或uid
-
$find . -type f -user root -print # 打印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跳過特定的目錄
-
-
$find . \(-name ".git" -prune \) -o \( -type f -print \)
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程序文件的行數
-