歡迎您光臨本站 註冊首頁

exec 與 xargs的區別

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

exec 與 xargs的區別

exec 與 xargs的區別

xargs:通過緩衝方式並以前面命令行的輸出作為參數,隨後的命令調用該參數

若忽略 xargs 的 options 來看的話,
cm1 | xargs cm2
可以單純看成: cm2 `cm1`
因此, find .... | xargs rm 也可作 rm `find ...` 來處理.
然而, 若 find 的結果太多, 可能會超過rm 可能接受的最大argument數量而失敗.
xargs優點:由於是批處理的,所以執行效率比較高(通過緩衝方式)
xargs缺點:有可能由於參數數量過多(成千上萬),導致後面的命令執行失敗

若換成 find ....-exec  rm {} \; 的話,
因為rm 是"逐個" item 去處理的, 則無此憂慮

例子:(在當前目錄下查找包含hello字元的文件) , 查找包含hello的c文件

1。最傻方法:grep hello *  */*  */*/*
                          grep  -i  "hello"  *.c    */*.c  */*/*.c2。使用exec$ find . -type f -print -exec grep "hello" {} \;
./file/test3
hello
./test1
hello
./test23。使用xargs$ find . -type f -print | xargs grep hello     
./file/test3:hello
./test1:hellofind pathname -options [-print -exec -ok]

    參數
        pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
        -print:     find命令將匹配的文件輸出到標準輸出。
        -exec:     find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' {} \;,注意{ }和\;之間的空格。
        -ok:       和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

    find命令選項

        -name:按照文件名查找文件。
        -perm:按照文件許可權來查找文件。
        -prune:使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那麼-prune將被find命令忽略。
        -user: 按照文件屬主來查找文件。
        -group:按照文件所屬的組來查找文件。

        -mtime -n +n:按照文件的更改時間來查找文件, - n表示文件更改時間距現在n天以內,+n表示文件更改時間距現在n天以前。Find命令還有-atime和-ctime選項,但它們都和-mtime選項。

        -nogroup:查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
        -nouser:查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。

        -newer file1 ! file2:查找更改時間比文件file1新但比文件file2舊的文件
        -type 查找某一類型的文件
                b - 塊設備文件。
                d - 目錄。
                c - 字元設備文件。
                p - 管道文件。
                l - 符號鏈接文件。
                f - 普通文件
        -size n: 查找文件長度為n塊的文件,帶有c時表示文件長度以位元組計。
        -depth:在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
        -fstype:查找位於某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息
                -mount:在查找文件時不跨越文件系統mount點。
                -follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
                -cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中


find

    當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件
            find . -name "*" -print

    在/etc目錄中查找文件名以host開頭的文件
            find /etc -name "host*" -print


exec

    find命令將所有匹配到的文件一起傳遞給exec執行
    有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤
    xargs命令每次只獲取一部分文件而不是全部

    匹配當前目錄下的所有普通文件
            find . -type f -exec ls -l {} \;

    在/ logs目錄中查找更改時間在5日以前的文件並刪除它們
            find logs -type f -mtime +5 -exec rm {} \;

    在當前目錄中查找所有文件名以.log結尾、更改時間在5日以上的文件,並刪除它們,在刪除之前先給出提示
            find . -name "*.log" -mtime +5 -ok rm {} \;

    首先匹配所有文件名為「 passwd*」的文件,然後執行grep命令查看這些文件中是否存在一個sam用戶
            find /etc -name "passwd*" -exec grep "sam" {} \;

    查找當前用戶主目錄下的所有文件
            find $HOME -print
            find ~ -print

    在當前目錄中文件屬主具有讀、寫許可權,並且文件所屬組的用戶和其他用戶具有讀許可權的文件
            find . -type f -perm 644 -exec ls -l {} \;

    查找系統中所有文件長度為0的普通文件,並列出它們的完整路徑
            find / -type f -size 0 -exec ls -l {} \;

    查找系統中所有屬於root組的文件
            find . -group root -exec ls -l {} \;

    查找當前目錄中的所有目錄並排序
            find . -type d |sort


xargs

    前面的輸出轉換為後方指令的參數輸入
    使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。

    查找系統中的每一個普通文件,然後使用xargs命令測試它們分別屬於哪類文件
        find . -type f -print | xargs file

    在整個系統中查找內存信息轉儲文件(core dump) ,然後把結果保存到/tmp/core.log 文件中
        find / -name "core" -print | xargs echo "" >/tmp/core.log

    在當前目錄下查找所有用戶具有讀、寫和執行許可權的文件,並收回相應的寫許可權
        find . -perm -7 -print | xargs chmod o-w

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

    統計當前目錄下所有文件的大小,含子目錄,精確到位元組
        find ./ -type f | xargs ls -l | awk 'BEGIN{size=0}{size+=$5};END{print size}'
《解決方案》

學習鳥  謝謝分享

[火星人 ] exec 與 xargs的區別已經有656次圍觀

http://coctec.com/docs/service/show-post-1389.html