郦东桥 發表於 2025-11-21 08:36:07

Linux递归修改后缀名实现方式

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1、修改命令</a></li><li><a href="#_label1">2、find</a></li><li><a href="#_label2">3、awk</a></li><li><a href="#_label3">4、xargs</a></li><li><a href="#_label4">总结</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1、修改命令</h2>
<p>需要用到:</p>
<ul><li><code>find</code></li><li><code>awk</code></li><li><code>xargs</code></li></ul>
<p>递归修改命令如下:</p>
<div class="jb51code"><pre class="brush:bash;">find . -name '*.XXX' | awk -F "." '{print $2}' | xargs -i -t mv ./{}.XXX ./{}.XXXX
</pre></div>
<p>把<code>XXX</code>后缀修改为<code>XXXX</code>。</p>
<p class="maodian"><a name="_label1"></a></p><h2>2、find</h2>
<p><code>find</code>用来在指定目录下查找文件,位于参数之前的字符串都被视为需要查找的目录。</p>
<p><code>find . -name &#39;*.XXX&#39;</code>中:</p>
<ul><li><code>.</code>:表示当前文件夹</li><li><code>-name</code>:表示文件名符合<code>name</code>的文件,有一个类似的<code>-iname</code>会忽略大小写</li><li><code>*.XXX</code>:表示寻找所有的<code>XXX</code>后缀的文件</li></ul>
<p>其他常用例子:</p>
<ul><li><code>find . -type f</code>:递归列出一般文件</li><li><code>find . -ctime -20</code>:递归列出最近20天内更新过的文件</li><li><code>find /var/log -type f -mtime +7 -ok rm {} \;</code>:查找<code>/var/log</code>下更新时间在7日以前的普通文件,并在删除之前询问</li><li><code>find . -type f -perm 644 -exec ls -l {} \;</code>:查找当前目录下权限为<code>644</code>的文件</li><li><code>find / -type f -size 0 -exec ls -l {} \;</code>:查找<code>/</code>下文件大小为0的普通文件并列出完整路径</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>3、awk</h2>
<p><code>awk</code>是一种处理文本文件的语言,是一个强大的分析工具。</p>
<p><code>awk -F &quot;.&quot; &#39;{print $2}&#39;</code>中:</p>
<ul><li><code>-F</code>:指定输入文件拆分分隔符,因为需要修改后缀名,后缀名与主文件名由<code>.</code>分隔,因此后面加上<code>&quot;.&quot;</code>参数</li><li><code>&#39;{print $2}&#39;</code>:<code>print</code>表示打印,<code>$</code>在awk中表示字段引用,这里<code>$2</code>表示引用第二个字段,字段根据前面的<code>-F</code>参数进行分隔。</li><li>因为<code>find</code>打印出来的是<code>./a/b/c.XXX</code>,因此<code>print $2</code>会打印其中第二个字段,就是路径<code>/a/b/c</code>,而<code>print $1</code>为空(因为第一个<code>.</code>之前没有其他内容),<code>print $3</code>为后缀名</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>4、xargs</h2>
<p><code>xargs</code>是给命令传递参数的一个过滤器,可以将管道或者标准输入数据转换为命令行参数,默认的命令为<code>echo</code>。使用<code>xargs</code>可以对不支持管道的命令添加类似管道的功能,比如:</p>
<div class="jb51code"><pre class="brush:bash;">find . -name '*.jpg' | ls -l
# 错误,但是能执行,执行的结果仅仅是ls -l的结果

find . -name '*.jpg' | xargs ls -l
# 正确
</pre></div>
<p><code>xargs -i -t mv ./{}.XXX ./{}.XXXX</code>中:</p>
<ul><li><code>-i</code>:表示将<code>xargs</code>的每项名称,一般是一行一行赋值给后面的<code>{}</code></li><li><code>-t</code>:可选,表示先打印需要执行的命令(这里是先打印<code>mv</code>)再执行</li><li><code>mv</code>:重命名</li><li><code>{}</code>:配合<code>-i</code>使用,这里的<code>{}</code>表示前一步<code>awk</code>中的路径名,对每一个路径都执行一次<code>mv</code>,也就是修改后缀名</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁: [1]
查看完整版本: Linux递归修改后缀名实现方式