Linux文件查找命令find,xargs詳述
前言:關于find命令 由于find具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。即使系統中含有網絡文件系統( NFS),find命令在該文件系統中同樣有效,只你具有相應的權限。 在運行一個非常消耗資源的find命令時,很多人都傾向于把它放在后臺執行,因為遍歷一個大的文件系統可能會花費很長的時間(這里是指30G字節以上的文件系統)。
一、find 命令格式
2、find命令的參數;
3、find命令選項
-name
另外,下面三個的區別:
???-amin n
4、使用exec或ok來執行shell命令 在有些操作系統中只允許-exec選項執行諸如l s或ls -l這樣的命令。大多數用戶使用這一選項是為了查找舊文件并刪除它們。建議在真正執行rm命令刪除文件之前,最好先用ls命令看一下,確認它們是所要刪除的文件。 exec選項后面跟隨著所要執行的命令或腳本,然后是一對兒{ },一個空格和一個\,最后是一個分號。為了使用exec選項,必須要同時使用print選項。如果驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文件名。 例如:為了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec選項中
# find . -type f -exec ls -l { } \;
上面的例子中,find命令匹配到了當前目錄下的所有普通文件,并在-exec選項中使用ls -l命令將它們列出。
$ find logs -type f -mtime +5 -exec rm { } \;
記住:在shell中用任何方式刪除文件之前,應當先查看相應的文件,一定要小心!當使用諸如mv或rm命令時,可以使用-exec選項的安全模式。它將在對每個匹配到的文件進行操作之前提示你。 在下面的例子中, find命令在當前目錄中查找所有文件名以.LOG結尾、更改時間在5日以上的文件,并刪除它們,只不過在刪除之前先給出提示。
$ find . -name "*.conf" -mtime +5 -ok rm { } \;
按y鍵刪除文件,按n鍵不刪除。 任何形式的命令都可以在-exec選項中使用。 在下面的例子中我們使用grep命令。find命令首先匹配所有文件名為“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后執行grep命令看看在這些文件中是否存在一個sam用戶。
# find /etc -name "passwd*" -exec grep "sam" { } \;
二、find命令的例子;
$ find $HOME -print
2、讓當前目錄中文件屬主具有讀、寫權限,并且文件所屬組的用戶和其他用戶具有讀權限的文件;
$ find . -type f -perm 644 -exec ls -l { } \;
3、為了查找系統中所有文件長度為0的普通文件,并列出它們的完整路徑;
4、查找/var/logs目錄中更改時間在7日以前的普通文件,并在刪除之前詢問它們;
5、為了查找系統中所有屬于root組的文件;
6、find命令將刪除當目錄中訪問時間在7日以來、含有數字后綴的admin.log文件。
$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok
7、為了查找當前文件系統中的所有目錄并排序;
8、為了查找系統中所有的rmt磁帶設備;
三、xargs 在使用find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。 find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,并如此繼續下去。 在有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,并非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高; 而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。 來看看xargs命令是如何同find命令一起使用的,并給出一些例子。 下面的例子查找系統中的每一個普通文件,然后使用xargs命令來測試它們分別屬于哪類文件
#find . -type f -print | xargs file
在整個系統中查找內存信息轉儲文件(core dump) ,然后把結果保存到/tmp/core.log 文件中:
$ find / -name "core" -print | xargs echo "" >/tmp/core.log
上面這個執行太慢,我改成在當前目錄下查找
#find . -name "file*" -print | xargs echo "" > /temp/core.log
在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,并收回相應的寫權限:
# ls -l
用grep命令在所有的普通文件中搜索hostname這個詞:
# find . -type f -print | xargs grep "hostname"
用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞:
# find . -name \* -type f -print | xargs grep "hostnames"
注意,在上面的例子中, \用來取消find命令中的*在shell中的特殊含義。 find命令配合使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。
四、find 命令的參數
1、使用name選項 可以使用某種文件名模式來匹配文件,記住要用引號將文件名模式引起來。 不管當前路徑是什么,如果想要在自己的根目錄$HOME中查找文件名符合*.txt的文件,使用~作為 'pathname'參數,波浪號~代表了你的$HOME目錄。
$ find ~ -name "*.txt" -print
想要在當前目錄及子目錄中查找所有的‘ *.txt’文件,可以用:
$ find . -name "*.txt" -print
想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件,可以用:
$ find . -name "[A-Z]*" -print
想要在/etc目錄中查找文件名以host開頭的文件,可以用:
$ find /etc -name "host*" -print
想要查找$HOME目錄中的文件,可以用:
$ find ~ -name "*" -print 或find . -print
要想讓系統高負荷運行,就從根目錄開始查找所有的文件。
$ find / -name "*" -print
如果想在當前目錄查找文件名以兩個小寫字母開頭,跟著是兩個數字,最后是.txt的文件,下面的命令就能夠返回名為ax37.txt的文件:
$find . -name "[a-z][a-z][0--9][0--9].txt" -print
2、用perm選項 如在當前目錄下查找文件權限位為755的文件,即文件屬主可以讀、寫、執行,其他用戶可以讀、執行的文件,可以用:
$ find . -perm 755 -print
還有一種表達方法:在八進制數字前面要加一個橫杠-,表示都匹配,如-007就相當于777,-006相當于666
# ls -l
-perm mode:文件許可正好符合mode -perm +mode:文件許可部分符合mode -perm -mode: 文件許可完全符合mode
3、忽略某個目錄 如果希望在/apps目錄下查找文件,但不希望在/apps/bin目錄下查找,可以用:
$ find /apps -path "/apps/bin" -prune -o -print
比如要在/usr/sam目錄下查找不在dir1子目錄之內的所有文件
find /usr/sam -path "/usr/sam/dir1" -prune -o -print
find [-path ..] [expression] 在路徑列表的后面的是表達式
-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o 這個表達式組合特例可以用偽碼寫為
if -path "/usr/sam" then
避開多個文件夾
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
圓括號表示表達式的結合。
\ 表示引用,即指示 shell 不對后面的字符作特殊解釋,而留給 find 命令去解釋其意義。
查找某一確定文件,-name等選項加在-o 之后
#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print
按文件屬主查找文件,如在$HOME目錄中查找文件屬主為sam的文件,可以用:
$ find ~ -user sam -print
在/etc目錄下查找文件屬主為uucp的文件:
$ find /etc -user uucp -print
為了查找屬主帳戶已經被刪除的文件,可以使用-nouser選項。這樣就能夠找到那些屬主在/etc/passwd文件中沒有有效帳戶的文件。在使用-nouser選項時,不必給出用戶名; find命令能夠為你完成相應的工作。 例如,希望在/home目錄下查找所有的這類文件,可以用:
$ find /home -nouser -print
就像user和nouser選項一樣,針對文件所屬于的用戶組, find命令也具有同樣的選項,為了在/apps目錄下查找屬于gem用戶組的文件,可以用:
$ find /apps -group gem -print
要查找沒有有效所屬用戶組的所有文件,可以使用nogroup選項。下面的find命令從文件系統的根目錄處查找這樣的文件
$ find / -nogroup-print
如果希望按照更改時間來查找文件,可以使用mtime,atime或ctime選項。如果系統突然沒有可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用mtime選項來查找這樣的文件。 用減號-來限定更改時間在距今n日以內的文件,而用加號+來限定更改時間在距今n日以前的文件。 希望在系統根目錄下查找更改時間在5日以內的文件,可以用:
$ find / -mtime -5 -print
為了在/var/adm目錄下查找更改時間在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print
8、查找比某個文件新或舊的文件
newest_file_name ! oldest_file_name
其中,!是邏輯非符號。 查找更改時間比文件sam新但比文件temp舊的文件: 例:有兩個文件
-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel
查找更改時間在比temp文件新的文件:
$ find . -newer temp -print
9、使用type選項
在/etc目錄下查找所有的目錄,可以用:
$ find /etc -type d -print
在當前目錄下查找除目錄以外的所有類型的文件,可以用:
$ find . ! -type d -print
在/etc目錄下查找所有的符號鏈接文件,可以用
$ find /etc -type l -print
可以按照文件長度來查找文件,這里所指的文件長度既可以用塊(block)來計量,也可以用字節來計量。以字節計量文件長度的表達形式為N c;以塊計量文件長度只用數字表示即可。 在按照文件長度查找文件時,一般使用這種以字節表示的文件長度,在查看文件系統的大小,因為這時使用塊來計量更容易轉換。
$ find . -size +1000000c -print
在/home/apache目錄下查找文件長度恰好為100字節的文件:
$ find /home/apache -size 100c -print
在當前目錄下查找長度超過10塊的文件(一塊等于512字節):
$ find . -size +10 -print
11、使用depth選項 在下面的例子中, find命令從文件系統的根目錄開始,查找一個名為CON.FILE的文件。 它將首先匹配所有的文件然后再進入子目錄中查找。
$ find / -name "CON.FILE" -depth -print
在當前的文件系統中查找文件(不進入其他文件系統),可以使用find命令的mount選項。 從當前目錄開始查找位于本文件系統中文件名以XC結尾的文件:
$ find . -name "*.XC" -mount -print
|
posted on 2006-04-12 16:11 蘑菇 閱讀(420) 評論(0) 編輯 收藏 所屬分類: 不知道哪里抄來的