本篇中我們將重點介紹三個常用工具的使用:Find、VI、Scp;
Find命令是一個非常有效工具,它可以遍曆目前的目錄甚至於整個檔案系統來尋找某些檔案或目錄。
Find命令的一般形式為:
find pathname -options [-print -exec -ok]
讓我們來看看該命令的參數:
| 參數 |
描述 |
| pathname |
find命令所尋找的目錄路徑。例如用.來表示目前的目錄,用/來表示系統根目錄。 |
| -print |
find命令將匹配的檔案輸出到標準輸出。 |
| -exec |
find命令對匹配的檔案執行該參數所給出的shell命令。相應命令的形式為command {} /;,注意{ }和/;之間的空格。 |
| -ok |
和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓使用者來確定是否執行。 |
options最常見選項:
| option |
描述 |
| -name |
按照檔案名稱尋找檔案 |
| -perm |
按照檔案許可權來尋找檔案 |
| -user |
按照檔案屬主來尋找檔案 |
| -group |
按照檔案所屬的組來尋找檔案 |
| -mtime -n +n |
按照檔案的更改時間來尋找檔案,-n表示檔案更改時間距現在n天以內,+n 表示檔案更改時間距現在n天以前。Find命令還有-atime和-ctime選項,但它們都和-mtime選項相似,所以我們在這裡只介紹-mtime選項 |
| -type |
尋找某一類型的檔案,比如:b - 塊裝置檔案;d - 目錄;c - 字元裝置檔案;p - 管道檔案;l - 符號連結檔案;f - 普通檔案 |
| -size n[c] |
尋找檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計 |
以下是一些常見執行個體:
| 命令 |
描述 |
| find . -name "*.txt" -print |
在目前的目錄及子目錄中尋找所有的'*.txt'檔案 |
| find . -name "[A-Z]*" -print |
目前的目錄及子目錄中尋找檔案名稱以一個大寫字母開頭的檔案 |
| find /etc -name "host*" -print |
在/etc目錄中尋找檔案名稱以host開頭的檔案 |
| find . -name "[a-z][a-z][0--9][0--9].txt" -print |
在目前的目錄尋找檔案名稱以兩個小寫字母開頭,跟著是兩個數字,最後是*.txt的檔案 |
| find . -size +1000000c -print |
在目前的目錄下尋找檔案長度大於1 M位元組的檔案 |
使用exec或ok來執行shell命令
當匹配到一些檔案以後,可能希望對其進行某些操作,這時就可以使用-exec選項。一旦find命令匹配到了相應的檔案,就可以用-exec選項中的命令對其進行操作(在有些作業系統中只允許-exec選項執行諸如ls或ls -l這樣的命令)。大多數使用者使用這一選項是為了尋找舊檔案並刪除它們。這裡我強烈地建議你在真正執行rm命令刪除檔案之前,最好先用ls命令看一下,確認它們是所要刪除的檔案。
exec選項後面跟隨著所要執行的命令,然後是一對兒{ },一個空格和一個/,最後是一個分號。
用xargs代替exec/ok
在使用find命令的-exec選項處理匹配到的檔案時,find命令將所有匹配到的檔案一起傳遞給exec執行。不幸的是,有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是"參數列太長"或"參數列溢出"。這就是xargs命令的用處所在,特別是與find命令一起使用。find命令把匹配到的檔案傳遞給xargs命令,而xargs命令每次只擷取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先擷取的一部分檔案,然後是下一批,並如此繼續下去。在有些系統中,使用-exec選項會為處理每一個匹配到的檔案而發起一個相應的進程,並非將匹配到的檔案全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統效能下降的問題,因而效率不高;而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次擷取所有的參數,還是分批取得參數,以及每一次擷取參數的數目都會根據該命令的選項及系統核心中相應的可調參數來確定。
以下是一些exec/ok/xargs使用的常見執行個體:
| 命令 |
描述 |
| find logs -type f -mtime +5 -exec rm {} /; |
在/logs目錄中尋找更改時間在5日以前的檔案並刪除它們 |
| find / -type f -size 0 -exec ls -l {} /; |
系統中所有檔案長度為0的普通檔案,並列出它們的完整路徑 |
| find /var/logs -type f -mtime +7 -exec rm {} /; |
尋找/var/logs目錄中更改時間在7日以前的普通檔案,並刪除它們 |
| find . -name "core" -print | xargs echo "" >/tmp/core.log |
在整個系統中尋找記憶體資訊轉儲檔案(core dump) ,然後把結果儲存到/tmp/core.log 檔案中 |
| find / -type f -print | xargs grep "device" |
用grep命令在所有的普通檔案中搜尋device這個詞 |
記住,在shell中用任何方式刪除檔案之前,應當先查看相應的檔案,一定要小心!