xargs命令的使用過程中一個小領悟:管道與xargs的差別

對xargs的使用總是比較模糊,大概的理解爲:通道中,上一個命令的標準輸出逐行作爲下一個命令的參數

例如 find /var/temp* | xargs rm -r

功效:找出/var/中所有temp開頭的文件和文件夾,再用rm逐行刪除

(因爲rm不支持管道,因此只能用xargs使find的結果逐行作爲rm的參數)

假設:

<span style="font-size:18px;">$ find /var/temp*
$ /var/temp1
  /var/temp2</span>
此時,再用xargs rm -r 等效於

<span style="font-size:18px;">$ rm -r /var/temp1
  rm -r /var/temp2</span>

============================分割===================================

那麼,管道與xargs有什麼差別呢
這是我在使用linux過程中的一個例子。

(find與grep都是支持管道的命令)

<span style="font-size:18px;">#找出/usr/shar/doc中bash-開頭的所有文件,結果如下(展開說明前的環境鋪墊)
[GMPY@14:44 ~]$find /usr/share/doc/bash-* -type f
/usr/share/doc/bash-completion/AUTHORS
/usr/share/doc/bash-completion/CHANGES.package.old
/usr/share/doc/bash-completion/bash_completion.txt
/usr/share/doc/bash-completion/README
/usr/share/doc/bash-completion/CHANGES
[GMPY@14:45 ~]$
</span>

大家再對比下下面有xargs與無xargs的結果差別

有xargs時的過濾:

<span style="font-size:18px;">[GMPY@14:49 ~]$find /usr/share/doc/bash-* -type f| xargs grep -Ew "README"
/usr/share/doc/bash-completion/bash_completion.txt:    also README.
/usr/share/doc/bash-completion/CHANGES:  * Fix bash_completion paths in README (Debian: #647941)
/usr/share/doc/bash-completion/CHANGES:  * README updated: explain how to use bash-completion correctly.
[GMPY@14:49 ~]$</span>

無xargs時的過濾:

</pre><pre name="code" class="cpp">
<span style="font-size:18px;">[GMPY@14:49 ~]$find /usr/share/doc/bash-* -type f| grep -Ew "README"
/usr/share/doc/bash-completion/README
[GMPY@14:53 ~]$
</span>
結果是不同的,爲什麼呢?

1、無xargs時是使用管道(雖然嚴格來說有xargs也是管道,這裏爲了區分暫時這麼稱呼),即把find命令的標準輸出作爲grep的檢索內容,等效於:find的結果作爲一個“字符串”被grep檢索

<span style="font-size:18px;">$ grep -Ew "README" </span>
<span style="font-size:18px;">"/usr/share/doc/bash-completion/AUTHORS
/usr/share/doc/bash-completion/CHANGES.package.old
/usr/share/doc/bash-completion/bash_completion.txt
/usr/share/doc/bash-completion/README
/usr/share/doc/bash-completion/CHANGES"</span>
2、有xargs時,則等效於檢索find命令找到的每一個文件
<span style="font-size:18px;">$ grep -Ew "README" /usr/share/doc/bash-completion/AUTHORS
$ grep -Ew "README" /usr/share/doc/bash-completion/CHANGES.package.old
$ grep -Ew "README" /usr/share/doc/bash-completion/bash_completion.txt
$ grep -Ew "README" /usr/share/doc/bash-completion/README
$ grep -Ew "README" /usr/share/doc/bash-completion/CHANGES</span>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章