1、find功能,查找目錄或文件
查找具有某些特徵文件的命令。
可遍歷當前目錄甚至於整個文件系統來查找某些文件或目錄。
遍歷大文件系統時,要放在後臺執行
2、find命令格式
find pathname -options [-print -exec -ok ...]
3、find命令參數
pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' { } \;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
4、find命令選項
-name 按照文件名查找文件。
-perm 按照文件權限來查找文件。
-prune 使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那麼-prune將被find命令忽略。
-user 按照文件屬主來查找文件。
-group 按照文件所屬的組來查找文件。
-mtime -n +n
按照文件的更改時間來查找文件, - n表示文件更改時間距現在n天以內,+ n表示文件更改時間距現在n天以前。find命令還有-atime和-ctime 選項,但它們都和-m time選項。
-nogroup 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
-nouser 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。
-newer file1 ! file2
查找更改時間比文件file1新但比文件file2舊的文件。
-type
查找某一類型的文件,諸如:
b - 塊設備文件。
d - 目錄。
c - 字符設備文件。
p - 管道文件。
l - 符號鏈接文件。
f - 普通文件。
-size n:[c] 查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計。
-depth:在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
-fstype:查找位於某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息。
-mount:在查找文件時不跨越文件系統mount點。
-follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
-cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。
另外,下面三個的區別:
-amin n
查找系統中最後N分鐘訪問的文件
-atime n
查找系統中最後n*24小時訪問的文件
-cmin n
查找系統中最後N分鐘被改變文件狀態的文件
-ctime n
查找系統中最後n*24小時被改變文件狀態的文件
-mmin n
查找系統中最後N分鐘被改變文件數據的文件
-mtime n
查找系統中最後n*24小時被改變文件數據的文件
例子
find .-name"*.txt"
find ~ -name"*.txt"
find .-name"[A-Z]*"-print
find .-name"[a-z]*"-print
find /etc/-name"host*"-print
find .-name"[a-z][a-z][0-9][0-9].txt"//以時間點爲準查找文件,假設當前時間爲1)已當前時間開始算起,+表示n天以前,從n天以前的時間點算起,往左算
find .-mtime+n
2)距離當前時間第n天的文件,往右算
find .-mtime-n3)距離當前時間n天以內
find .-mtime n
//查找當前目錄 文件類型是普通文件 文件權限664
find .-type f -perm664-exec ls -l {} \;
//查找 大小爲0的普通文件
find .-type f -size0-exec ls -l {} \;
//查找目錄中更改時間在7日以前的普通文件,並在刪除之前詢問它們
find .-type f -mtime+7-ok rm {} \;
//查找系統中所有屬於 hzmct 組的文件
find .-group hzmct -exec ls -l {} \;
//find命令將刪除據現在5天以內、含有數字的ad.log文件
find .-name"ad.log[0-9][0-9][0-9]"-atime-5-ok ls -l { } \;
//爲了查找當前文件系統中的所有目錄並排序
find .-type d | sort
//用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞
find .-type f -print| xargs grep "hostnames"
find .-name\*-type f -print| xargs grep "hostnames"
爲什麼要使用xargs
xargs - build and execute command lines from standard input
在使用find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現 溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。
find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然後是下一批,並如此繼續下去。
在有些系統中,使用-exec選項會爲處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作爲參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;
而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的 -7數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
來看看xargs命令是如何同find命令一起使用的,並給出一些例子。
在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,並收回相應的寫權限:
# ls -l
drwxrwxrwx 2 sam adm 409610月 3020:14 file6
-rwxrwxrwx 2 sam adm 010月 3101:01 http3.conf
-rwxrwxrwx 2 sam adm 010月 3101:01 httpd.conf
# find . -perm -7 -print | xargs chmod o-w# ls -l
drwxrwxr-x2 sam adm 409610月 3020:14 file6
-rwxrwxr-x2 sam adm 010月 3101:01 http3.conf
-rwxrwxr-x2 sam adm 010月 3101:01 httpd.conf
用grep命令在所有的普通文件中搜索hostname這個詞:
# find . -type f -print | xargs grep "hostname"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞:
# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
注意,在上面的例子中, \用來取消find命令中的*在shell中的特殊含義。
find命令配合使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。