博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xargs
阅读量:4285 次
发布时间:2019-05-27

本文共 2143 字,大约阅读时间需要 7 分钟。

轉載自http://blog.yam.com/ddy1280/article/13941218

 

範例:
    假設有一個目錄如下  (這個樹狀目錄架構是使用 tree 指令所產生的)
.
|-- Makefile
|-- VERSION
|-- VERSION.bak
|-- inc
|   |-- fork.h
|   |-- main.h
|   `-- main.h.bak
`-- src
    |-- common_lib
    |   |-- dl_math.c
    |   |-- dl_math.c.bak
    |   |-- dl_string.c
    |   `-- dl_string.c.bak
    |-- fork.c
    |-- fork.c.bak
    `-- main.c

find -iname "*.bak" | xargs rm


紅色部份就是xargs 使用的方式,它會將前面的輸出轉化為它後方指令的參數輸入
執行之後,所有的*.bak 備份檔都被清乾淨了,所有子目錄下的 bak檔也被清除了
很不錯吧~~~^__^
但是這個寫法還有一點缺失…
就是當前方程式沒有任何輸出時…後方的指令就會沒有參數輸入…
以這個例子來看…就會出現這個錯誤訊息
rm: missing operand
Try `rm --help' for more information.

在xargs 裡面有一個參數是 --no-run-if-empty  可以改善上述的問題,當沒前面的程式沒有輸出時,就不執行後面的程式

find -iname "*.bak" | xargs --no-run-if-empty rm

上述的指令會有如下的效果:
rm ./VERSION.bak ./inc/main.h.bak ./src/fork.c.bak \    
       ./src/common_lib/dl_string.c.bak 
./src/common_lib/dl_math.c.bak

 

find -iname "*.bak" | xargs -i cp {} ~/bakdir

使用 -i 和 {}  就可以把前面所得到的輸出列表,不是一整串,而是一個一個地傳給後面的指令
上述的指令的效果就像是這樣…
cp ./VERSION.bak ~/bakdir
cp ./inc/main.h.bak ~/bakdir
cp  ./src/fork.c.bak ~/bakdir
cp  ./src/common_lib/dl_string.c.bak ~/bakdir
cp  ./src/common_lib/dl_math.c.bak ~/bakdir

 

find ./ -type f -name "*.html" | xargs -i rm {}
找出*.html的檔案,xargs -i的意思是把這些檔案放在{}裡
但有時候file name含有空白(space)、換行(\r\n or \n)等符號
就得改成
find ./ -type f -name "*.html" -print0 | xargs -i -0 rm {}

 

 

 

轉載自http://zh.wikipedia.org/wiki/Xargs

xargs是一條和的常用命令。它的作用是將參數列轉換成小塊分段傳遞給其他命令,以避免參數列過長的問題

例如,下面的命令:

rm `find /path -type f`

如果path目錄下檔案過多就會因為「參數列過長」而報錯無法執行。但改用xargs以後,問題即獲解決。

find /path -type f -print0 | xargs -0 rm

本例中xargs將產生的長串檔案列表拆散成多個子串,然後對每個子串呼叫。-print0表示輸出以null分隔(-print使用換行);-0表示輸入以null分隔。這樣要比如下使用find命令效率高的多。

find /path -type f -exec rm '{}' \;

上面這條命令會對每個檔案呼叫"rm"命令。當然使用新版的"find"也可以得到和"xargs"命令同樣的效果:

find /path -type f -exec rm '{}' +

xargs的作用一般等同於大多數中的,但更加靈活易用,並可以正確處理輸入中有空格等特殊字元的情況。對於經常產生大量輸出的命令如、和來說非常有用。

 

find . -name "*.foo" | xargs grep bar

該命令大體等價於

grep bar `find . -name "*.foo"`
find . -name "*.foo" -print0 | xargs -0 grep bar

使用了GNU特殊規定的空字元。

find . -name "*.foo" -print0 | xargs -0 -t -r vi

與上面的基本相同但啟動進行編輯。-t參數會提前列印錯誤訊息。-r參數是一個GNU擴充功能,表明在無輸入情況下則不構造命令執行。

find . -name "*.foo" -print0 | xargs -0 -i mv {
} /tmp/trash

使用-i參數將{}中內容替換為列表中的內容。

转载地址:http://wlsgi.baihongyu.com/

你可能感兴趣的文章
Angular 内置结构型指令
查看>>
Angular 内置属性型指令
查看>>
cookie 跨域访问整理
查看>>
Angular中的模板和表达式简介
查看>>
Angular 绑定语法简介
查看>>
Ionic创建项目失败:[ERROR] Network connectivity error occurred, are you offline?
查看>>
Visual Studio Code v1.19发布
查看>>
Cordova 卸载
查看>>
NPM 设置代理
查看>>
nrm切换npm源利器
查看>>
curl工具使用简介
查看>>
C# 使用curl工具 上传图片到微信服务器示例
查看>>
C# Newtonsoft.Json JObject合并对象整理
查看>>
C# 调用微信公众号接口生成带参数二维码、下载、合并
查看>>
C# 调用微信公众号接口发送客服消息示例
查看>>
C# 调用微信公众号接口获取会员信息示例
查看>>
mysql-5.7.xx-winx64服务无法启动解决方案
查看>>
mysql5.7下面windows平台大小写敏感处理
查看>>
安装了淘宝npm后运行cnpm命令提示不是内部或外部命令。
查看>>
Visual Studio 2017 15.5 版发行说明
查看>>