find 命令詳解

hurp_oracle發表於2014-10-15

如果需要把一條命令在標準輸出上的輸出結果,轉換為另一個程式或或者另一個命令的引數,可以用xargs命令。 
# man xargs 
可以看到例子: 
1、 find /tmp -name core -type f -print | xargs /bin/rm -f 
用find命令在tmp目錄下查詢以core命名的檔案,然後刪除它們。需要注意的是如果檔名字包含新行或者空格的話,這條命令將會被錯誤操作。 
2、find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f 
    這條命令就正確地處理了新行和空格,有可能帶來的錯誤。 
    這條命令和上一條意思一樣。 
3、cut -d: -f1 < /etc/passwd | sort | xargs echo 
     大概列舉了系統的使用者。 
4、find ./ -type f -print | xargs -i mv -f {} ./newdir 
     -i 表示 find 傳遞給xargs的結果 由{}來代替 
注意:cshell和tcshell中,需要將{}用單引號、雙引號或反斜槓,否則不認識。bash可以不用。建議加上。

例如:

find ./ -type f -print | xargs -t -i mv -f "{ }" ./newdir 列印顯示

find ./ -type f -print | xargs -p -i mv -f "{ }" ./newdir   詢問是否執行?

find ./ -type f -print | xargs -t -p -i mv -f "{ }" ./newdir 列印顯示,並詢問是否執行?

   管道是把一個命令的輸出傳遞給另一個命令作為輸入,比如: 
command1 | command2 
    但是command2僅僅把輸出的內容作為輸入引數。 
    find . -name "install.log" -print列印出的是install.log這個字串,如果僅僅使用管道,那麼command2能夠使用的僅僅是install.log這個字串, 不能把它當作檔案來進行處理。當然這個command2除了xargs。xargs就是為了能夠對find搜尋到的檔案進行操作而編寫的。它能把管道傳來 的字串當作檔案交給其後的命令執行。 
舉個例子: 
(1)$find . -name "install.log" -print | cat 
./install.log   #顯示從管道傳來的內容,僅僅作為字串來處理 
(2)$find . -name "install.log" -print | xargs cat 
aaaaaa        #將管道傳來的內容作為檔案,交給cat執行。也就是說,該命令執行的是如果存在install.log,那麼就列印出這個檔案的內容。

   透過這個例子,應該很容易理解這樣有什麼不同了。當你要對匹配檔案操作時,使用find and xargs。其實這都是運用了管道。xargs是shell命令的一個,可以把管道輸入的內容轉化為其引數要操作的檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29446986/viewspace-1300111/,如需轉載,請註明出處,否則將追究法律責任。