歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux命令(shell)從入門到精通 學習筆記之2 使用find和xargs

Linux命令(shell)從入門到精通 學習筆記之2 使用find和xargs

日期:2017/3/1 18:06:13   编辑:SHELL編程

1. 使用 find 可以查找出符合某一特性(如權限、屬主、長度、類型、名字等)的文件或目錄,結合 -exec、-ok 和 -xargs,可以完成更多的工作。

2.find 的 name 選項:

根據文件名字匹配查找,如在自己的根目錄下查找符合 *.txt 的文件:

擴展:find / ! -name "myshell" -print
(
從上面的輸出可以看出,對於 root 用戶而言:
~
$HOME
/root
代表的都是同一個目錄,就是 /root。

特別的,對於用戶 xxx 而言, $HOME 和 ~ 代表的就是 /xxx 目錄,這個目錄的位置(以 zhy 用戶為例),如下:


可以看到,/zhy 是在 /home 下。對於非管理員用戶, /xxx 目錄都是在 /home下,而 root用戶的 /root 目錄位置如下:


是直接位於根目錄下的(管理員是老大嘛,當然優待咯)。
)

在當前目錄下查找,就用 “.“:
# 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 ( # find / -print)
對這個命令稍加修改:
# find / -name "*" -print &
就可以讓它在後台運行了,這個時候,通過 ctrl + c ,也不能中斷它的執行了。。。

查找文件以兩個小寫字母開頭,跟著是兩個數字的 .txt 文件,可以用:
# find / -name "[a-z][a-z][0-9][0-9].txt" -print

3. find 的 perm 選項:

按照文件權限來查找文件。

查找文件屬主可以讀、寫、執行,其他用戶可以讀、執行的文件:
# find . -perm 755 -print
如:

擴展:find . ! -perm 755 -print

4. find 的 prune 選項:

查找文件時,忽略某個目錄,如:
如果希望在 /apps 目錄下查找文件,但不希望在 /apps/bin 目錄下查找,可以用:
# find /apps -name "/apps/bin" -prune -o -print

5. user 和 nouser 選項:

user : 根據文件的屬主查找文件:
# find . -user zhy -print

在linux下,可能有些屬主,可能被管理員刪掉了,這個時候,就能用-nouser 選項找到那些在屬主在 /etc/passwd文件中沒有有效賬戶的文件。在用 -nouser 時,不用給出用戶名。
# find / -nouser -print

6. 使用 group 和 nogroup:

就像使用 user 和 nouser 一樣,group 與 nogroup 選項能找出屬於某一用戶組的文件,和用戶組已經不存在的文件。
# find / -group zhy -print
# find / -nogroup -print

7. 使用 -mtime 選項:

該選項可以查找指定時間內或指定時間外修改的文件,如果系統突然沒有可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用 mtime 選項來查找這樣的文件:

-1表示1日(24小時)之內更改過的文件。
+2表示2日(48小時)之前更改過的文件。

8. newer 選項:

newer 命令能讓我們找出更改時間介於兩個文件之間的文件,如有下面兩個文件,它們更改時間相差大概兩天:

通過下面的命令,我們就可以找出更改時間介於這兩者的文件了:
# find / -newer age.awk ! -newer belts.awk -exec ls -l {} \;

從上面可以看出,這種比較必須有參考的文件,比如要查找更改時間在兩個小時以內的文件,就必須有一個更改時間正好在兩個小時之前那個時刻的文件可以供參考。這裡我們可以通過 touch 來創建一個指定更改時間的文件:
假如現在是 12月26日10點41分,那就需要創建一個更改時間在12月26日08點41分的文件:
# touch -t 12260841 oldfile
然後通過:
# find / -newer oldfile -print
來查找更改時間在兩個小時內的文件。

9. 用 type 查找指定類型的文件:

在根目錄下,查找所有的目錄:
# find / -type d - print

查找除目錄以外所有類型的文件:
# find / ! -type d -print

查找所有符號鏈接文件:
# find / -type l -print

查找所有普通文件:
# find / -type f -print

10. 使用 size 選項:

使用可以查找指定長度的文件,可以以字節為單位,也可以用塊為單位,1塊 = 512字節(0.5M)。
以字節為單位,需要在數字後面加 c,如:
在根目錄下查找文件長度大於 1M 的文件:
# find / -size +1000000c -print

用塊表示就是:
# find / -size +2 -print

查找剛好是100字節的文件:
# find / -size 100c -print

查找小於100字節的文件:
# find / -size -100c -print

11. 使用 depth 選項:

查找時使用depth命令,可以先在指定文件的根目錄下查找所有文件,再進入子目錄中查找,有時備份可能需要這樣做。
如:從根目錄開始,查找名為 "CON.FILE" 的文件,它將首先匹配所有的文件然後再進入子目錄查找:
# find / -name "CON.FILE" -depth -print

12. 使用 mount 選項:

查找文件時,可以只在指定目下查找,而不進入子目錄下查找,這可以通過 mount 指定。
如:
# find . -name "*.XC" -mount -print

13. 使用cpio選項:

cpio 選項可以用來向磁帶設備備份文件或從中恢復文件。結合find,可以在整個文件系統中查找文件,然後用 cpio 命令將其備份到磁帶上。
下面的命令:
# cd /
# find etc home apps -depth -print | cpio -ivcdC65535 -o \
/dev/rmt0

\ 用來告訴系統,shell 命令還沒有結束,請忽略 \ 後面的回車。該命令用來將 /etc、/home 和 /apps 目錄下的文件備份到設備 /dev/rmt0 中。

上面命令中 etc 、home、 apps 前都沒有 / ,這是用了相對路徑(用了 / 就是絕對路徑),之所以用相對路徑,是因為:

在從磁帶中恢復這些文件的時候,可以選擇恢復文件的路徑。例如,可以將這些文件先恢復到另外一個目錄中,對它們進行某些操作後,再恢復到原始目錄中。如果在備份時使用了絕對路徑,例如 /etc,那麼在恢復時,就只能恢復到 /etc 目錄中去,別無其他選擇。

上面的命令,告訴 find 命令首先進入 /etc 目錄,然後是 /home 和 /apps 目錄,先匹配這些目錄下的文件,然後再匹配其子目錄中的文件,所有這些結果將通過管道傳遞給 cpio 命令進行備份。

順便說一下,在上面的例子中 cpio 命令使用了 C65536 選項,我本可以使用 B 選項,不過這樣每塊的大小只有 512 字節,而使用了 C65536 選項後,塊的大小變成了 64K 字節(65536 / 1024) 。

14. 使用 exec 或 ok 選項:

用 find 匹配到一些文件之後,可以用 exec 和 ok 選項來對其進行某些操作。
用 exec 和 ok 的格式是:exec(ok) 選項後面跟隨著所要執行的命令,然後是一對兒 {},一個空格和一個\,最後是一個分號。
如:

# find . -type f -exec ls -l {} \;
該命令查找並列出匹配到的文件。

# find logs -type f -mtime +5 -exec rm {} \;
該命令查找更改時間在5天以前的普通文件,並刪除它們。

exec 的安全模式:ok
# find . -name "*.LOG" -mtime +5 -ok rm {} \;
該命令和用 exec 的唯一區別就是 該命令在刪除時,會給出提示。

# find /etc -name "passwd*" -exec grep "zhy" {} \;


該命令首先匹配所有名為 "passwd*" 的文件,如:passwd、pssswd.old、passwd.bak,然後執行 grep 命令查看在這些命令中是否存在 zhy 用戶。

find 的其他例子:
# find ~ -print ( find $HOME -print)
查找所有文件

# find . -type f -perm 4755 -print
查找 suid 置位,文件屬主具有讀、寫、執行權限,其他用戶具有讀和執行權限的文件。

# find / -group zhy -print
查找屬主是 zhy 的文件。

# $ find /logs -name 'admin.log[0-9][0-9][0-9]' -mtime +7 -exec rm {} \;
查找具有指定名稱的,修改日期在7天以前的文件,並刪除。

# find /dev/rmt -print
查找系統中所有的 rmt 磁帶設備。

15. 使用 xargs 選項:

為什麼使用 xargs:

在使用f i n d命令的- e x e c選項處理匹配到的文件時,f i n d命令將所有匹配到的文件一起傳遞給e x e c執行。不幸的是,有些系統對能夠傳遞給 e x e c的命令長度有限制,這樣在f i n d命令運行幾分鐘之後,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出” 。這就是x a rg s命令的用處所在,特別是與 f i n d命令一起使用。F i n d命令把匹配到的文件傳遞給 x a rg s命令,而x a rg s命令每次只獲取一部分文件而不是全部,不像 - e x e c選項那樣。這樣它可以先處理最先獲取的一部分文件,然後是下一批,並如此繼續下去。在有些系統中,使用 - e x e c選項會為處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;而使用 xargs 命令則只有一個進程。另外,在使用 x a rg s命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。

例:

# find / -type f -print | xargs file | tee /root/shell/xargs.log
查找系統中的每一個普通文件,然後使用 x a rg s命令來測試它們分別屬於哪類文件,並將輸出導入到 xargs.log 文件中。用 -exec 試下,就是:

# find / -type f -print -exec file {} \; | tee /root/shell/exec.log
通過對比 xargs.log 和 exec.log ,發現二者的輸出,確實一樣,但執行 xargs 命令的效率明顯比 -exec 快很多(從執行速度上看)。

# find /apps/audit -perm 777 -print | xargs chmod o-w
在/ a p p s / a u d i t目錄下查找所有用戶具有讀、寫和執行權限的文件,並收回其他用戶的寫權限。

# find / -type f -print | xargs grep "device"
用 grep 命令在所有的普通文件中搜索device這個詞:

# find . -name \* -type f -print | xargs grep "192.168.5.29"
該命令在當前目錄下的所有普通文件中搜索 192.168.5.29 這個詞,\用來取消 find 命令中的*在 shell 中的特殊含義。

Copyright © Linux教程網 All Rights Reserved