使用xargs命令实现文件批量重命名

关于xargs的说明,请参考维基百科的说明

xargs是一条Unix类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题

批量重命名的例子如下:
当前文件夹下有3个文件,后缀名都是txt
adam@hdn1:~/test$ ls
a.txt b.txt hello world.txt

现在想把后缀名txt的文件批量重命名,在原始文件名后增加.bak

adam@hdn1:~/test$ ls | xargs -i -t mv {} {}.bak
mv a.txt a.txt.bak
mv b.txt b.txt.bak
mv hello world.txt hello world.txt.bak

adam@hdn1:~/test$ ls
a.txt.bak b.txt.bak hello world.txt.bak

上面命令中xargs参数的说明:
-i 表示使用在xargs中执行命令中,使用{}表示传入的参数
-t 表示将xargs后面执行命令的结果显示到标准输出设备,也就是输出到屏幕

如果刚才的操作还原回去,也就是把文件名中的后缀.bak批量去掉,该怎么处理?
其实也不难,中间增加一次sed命令就可以了。
adam@hdn1:~/test$ ls | sed 's/.bak$//g' | xargs -i -p mv {}.bak {}
mv a.txt.bak a.txt ?...y
mv b.txt.bak b.txt ?...y
mv hello world.txt.bak hello world.txt ?...y

xargs中新出现参数的说明:
-p 表示每次执行的命令都需要确认

另外还可以执行xargs后面命令每次执行参数的个数,如下面的例子
adam@hdn1:~/test$ ls *.txt | xargs -t -n 2 rm
rm a.txt b.txt
rm hello world.txt
rm: cannot remove `hello': No such file or directory
rm: cannot remove `world.txt': No such file or directory

可以看出第一次执行rm命令的时候,参数是a.txt和b.txt两个文件
咦,删除第三个文件怎么出错了呢?
原来第三文件hello world.txt,文件名中间有一个空格,而xargs默认传递参数的时候是以空格和换行符分隔,所以当成了hello和world.txt两个文件,当然会出错了。
换一个变通的方法:
adam@hdn1:~/test$ find . -name "*.txt" -print0 | xargs -0 -t -n 2 rm
rm ./a.txt ./hello world.txt
rm ./b.txt

参考文章:
参数代换命令xargs
Invoking the shell from xargs
关于xargs,你可能不知道的

Comments are closed.