多姿多彩 發表於 2023-8-5 00:00:00

Linux基础之xargs命令的入门实例

<p>
        <span><strong>简介</strong></span></p>
<p>
        xargs命令有两个要点。第一,你必须列出目标文件。第二,你必须指定对每个文件需要执行的命令或脚本。</p>
<p>
        xargs命令被用来处理分布在不同目录下的文件:</p>
<ul>
<li>
                计算所有文件的行数</li>
        <li>
                打印指定文件的第一行</li>
        <li>
                对每个文件执行一个自定义脚本</li>
</ul>
<p>
        xargs可以将输入内容(通常通过命令行管道传递),转成后续命令的参数,通常用途有:</p>
<ul>
<li>
                命令组合:尤其是一些命令不支持管道输入,比如ls。</li>
        <li>
                避免参数过长:xargs可以通过-nx来将参数分组,避免参数过长。</li>
</ul>
<p>
        <strong>使用语法如下</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_541903">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">Usage: </code><code class="bash functions">xargs</code> <code class="bash plain">... COMMAND INITIAL-ARGS...</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">Run COMMAND with arguments INITIAL-ARGS and </code><code class="bash functions">more</code> <code class="bash plain">arguments </code><code class="bash functions">read</code> <code class="bash plain">from input.</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>入门例子</strong></span></p>
<p>
        首先,创建测试文件</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_631191">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">touch</code> <code class="bash plain">a.js b.js c.js</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        接着,运行如下命令:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_686519">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">*.js | </code><code class="bash functions">xargs</code> <code class="bash functions">ls</code> <code class="bash plain">-al</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        输出如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_655445">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">-rw-r--r-- 1 a wheel 0 12 18 16:18 a.js</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">-rw-r--r-- 1 a wheel 0 12 18 16:18 b.js</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">-rw-r--r-- 1 a wheel 0 12 18 16:18 c.js</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        命令解释:</p>
<ul>
<li>
                首先,ls *.js的输出为a.js b.js c.js。</li>
        <li>
                通过管道,将a.js b.js c.js作为xargs的输入参数。</li>
        <li>
                xargs命令收到输入参数后,对参数进行解析,以空格/换行作为分隔符,拆分成多个参数,这里变成a.js、b.js、c.js。</li>
        <li>
                xargs将拆分后的参数,传递给后续的命令,作为后续命令的参数,也就是说,组成这样的命令ls -al a.js b.js c.js。</li>
</ul>
<p>
        可以加上-t参数,在执行后面的命令前,先将命令打印出来。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_240718">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">*.js | </code><code class="bash functions">xargs</code> <code class="bash plain">-t </code><code class="bash functions">ls</code> <code class="bash plain">-al</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        输出如下,可以看到多了一行内容ls -al a.js b.js c.js,这就是实际运行的命令。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_645868">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">-al a.js b.js c.js</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">-rw-r--r-- 1 a wheel 0 12 18 16:18 a.js</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">-rw-r--r-- 1 a wheel 0 12 18 16:18 b.js</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">-rw-r--r-- 1 a wheel 0 12 18 16:18 c.js</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>例子:参数替换</strong></span></p>
<p>
        有的时候,我们需要用到原始的参数,可以通过参数-i或-I实现。参数说明如下</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_76824">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">-I R  same as --replace=R (R must be specified)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">-i,--replace= Replace R </code><code class="bash keyword">in</code> <code class="bash plain">initial arguments with names</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash functions">read</code> <code class="bash plain">from standard input. If R is</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">unspecified, assume {}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        例子如下,将所有的.js结尾的文件,都加上.backup后缀。-I '{}'表示将后面命令行的{}替换成前面解析出来的参数。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_980492">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">*.js | </code><code class="bash functions">xargs</code> <code class="bash plain">-t -I </code><code class="bash string">'{}'</code> <code class="bash functions">mv</code> <code class="bash plain">{} {}.backup</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        展开后的命令如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_239039">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">mv</code> <code class="bash plain">a.js a.js.backup</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash functions">mv</code> <code class="bash plain">b.js b.js.backup</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash functions">mv</code> <code class="bash plain">c.js c.js.backup</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>例子:参数分组</strong></span></p>
<p>
        命令行对参数最大长度有限制,xargs通过-nx对参数进行分组来解决这个问题。</p>
<p>
        首先,创建4个文件用来做实验。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_141957">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">touch</code> <code class="bash plain">a.js b.js c.js d.js</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        然后运行如下命令:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_39656">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">*.js | </code><code class="bash functions">xargs</code> <code class="bash plain">-t -n2 </code><code class="bash functions">ls</code> <code class="bash plain">-al</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        输出如下,-n2表示,将参数以2个为一组,传给后面的命令。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_498532">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">-al a.js b.js </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">-rw-r--r-- 1 root root 0 Dec 18 16:52 a.js</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">-rw-r--r-- 1 root root 0 Dec 18 16:52 b.js</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">-al c.js d.js </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">-rw-r--r-- 1 root root 0 Dec 18 16:52 c.js</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">-rw-r--r-- 1 root root 0 Dec 18 16:52 d.js</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>例子:特殊文件名</strong></span></p>
<p>
        有的时候,文件名可能存在特殊字符,比如下面的文件名中存在空格。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_7093">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">touch</code> <code class="bash string">'hello 01.css'</code> <code class="bash string">'hello 02.css'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        运行之前的命令会报错,因为xargs是以空格/换行作为分隔符,于是就会出现预期之外的行为。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_732620">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash comments"># 命令</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash functions">find</code> <code class="bash plain">. -name </code><code class="bash string">'*.css'</code> <code class="bash plain">| </code><code class="bash functions">xargs</code> <code class="bash plain">-t </code><code class="bash functions">ls</code> <code class="bash plain">-al</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash comments">#输出</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash functions">ls</code> <code class="bash plain">-al .</code><code class="bash plain">/hello</code> <code class="bash plain">01.css .</code><code class="bash plain">/hello</code> <code class="bash plain">02.css </code><code class="bash comments"># 展开后的命令</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash functions">ls</code><code class="bash plain">: cannot access .</code><code class="bash plain">/hello</code><code class="bash plain">: No such </code><code class="bash functions">file</code> <code class="bash plain">or directory</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash functions">ls</code><code class="bash plain">: cannot access 01.css: No such </code><code class="bash functions">file</code> <code class="bash plain">or directory</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash functions">ls</code><code class="bash plain">: cannot access .</code><code class="bash plain">/hello</code><code class="bash plain">: No such </code><code class="bash functions">file</code> <code class="bash plain">or directory</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash functions">ls</code><code class="bash plain">: cannot access 02.css: No such </code><code class="bash functions">file</code> <code class="bash plain">or directory</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        xargs是这样解决这个问题的。</p>
<ul>
<li>
                -print0:告诉find命令,在输出文件名之后,跟上NULL字符,而不是换行符;</li>
        <li>
                -0:告诉xargs,以NULL作为参数分隔符;</li>
</ul>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_443611">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">find</code> <code class="bash plain">. -name </code><code class="bash string">'*.css'</code> <code class="bash plain">-print0 | </code><code class="bash functions">xargs</code> <code class="bash plain">-0 -t </code><code class="bash functions">ls</code> <code class="bash plain">-al</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>例子:日志备份</strong></span></p>
<p>
        将7天前的日志备份到特定目录</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_807583">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">find</code> <code class="bash plain">. -mtime +7 | </code><code class="bash functions">xargs</code> <code class="bash plain">-I </code><code class="bash string">'{}'</code> <code class="bash functions">mv</code> <code class="bash plain">{} </code><code class="bash plain">/tmp/otc-svr-logs/</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        <strong>相关链接</strong></p>
<p>
        https://craftsmanbai.gitbooks...</p>
<p>
        http://wiki.jikexueyuan.com/p...</p>
<p>
        原文链接:https://segmentfault.com/a/1190000012566053</p>
頁: [1]
查看完整版本: Linux基础之xargs命令的入门实例