Linux下批量重命名文件使用命令行操作起来效率非常高,几个命令就能够搞定,经理我还是老套路,先把问题分解:
读取使用文件列表解析文件列表的信息,重命名文件所以能够看出来读取并且解析文件列表是比较核心关键的。
读取解析文件列表
不知道题主说的用来重命名文件列表的文件大致是什么样子,那我就举一个相对常见的例子吧,来看这个用作重命名的filelist文件内容:
日照香炉生紫烟.txt 遥看瀑布挂前川.txt
举头望明月.txt 低头思故乡.txt
桃花潭水深千尺.txt 不及汪伦送我情.txt
第一列是源文件名,第二列是目标文件名。也就是说要将第一列的文件名重新命名为第二列的文件名。看到这样的分列,马上我们就想到了awk命令。现在这个问题就转换成了这样一个流程:
先用cat读入文件内容,再使用awk将每一行的分列中的内容分别取出,最后需要将取出的域变成mv命令的两个参数。
我们先做解析文件:
cat filelist | awk -F' ' '{print $1;print $2}'
-F参数和后面的空格字符指定了域分隔符为空格,然后输出两个域的内容,用分号分隔开是为了作为两个字符串输出(←这里是重点)。
解析文件列表的信息,重命名文件
在这里我们需要将上一节设计的命令的输出结果作为参数传递给mv语句来实现重命名。这里用到的命令是xargs。xargs可以接收管道传递过来的字符串作为参数给后面的命令使用,比如:
echo 'man.txt' | xargs -I{} mv {} ager.txt
这一句的意思就是将man.txt作为后面mv的第一个参数,通过xargs传递给mv。xargs的-I参数指定后面的花括号{}作为参数的占位符,等同于传递过来的参数。
我们要实现的效果稍微复杂一点,因为我们的mv需要两个参数,要用到xargs的-n2参数来指定传递参数的个数为2。所以我们需要的语句的最终形式是这样的:
cat filelist | awk -F' ' '{print $1;print $2}'|xargs -n2 mv看一下效果:
完美解决问题。
总结一下,批量重命名还有其它的办法(我知道你又要说用while循环),但是我觉得这个应该是比较方便的了。源文件和目标文件的名字稍微处理一下,按照这种格式保存成为文本文档,一串命令就搞定。
关于像这样的批量重命名的操作,很多类似“运维面试100题”之类的文章里可能都有涉及,但是语焉不详,命令生涩难记。学习Linux最好的办法就是自己实际操作一下,更好的办法就是关注经理,每天看经理的悟空问答,每天都有这类小操作的详细解答。一天学一点,100天之后就会发现一个不同的自己。
举报/反馈