tar
会为您快速做到这一点。
测试
首先,我创建了2个目录和10个文件:
% mkdir test1 test2 ; cd test1
% for n in `seq 1 10` ; do touch ABC.file$n ; done
% ls
> ABC.file1 ABC.file2 ABC.file4 ABC.file6 ABC.file8
> ABC.file10 ABC.file3 ABC.file5 ABC.file7 ABC.file9
然后我复制了它们:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC/DEF/' -xf -
% ls ../test2
> DEF.file1 DEF.file2 DEF.file4 DEF.file6 DEF.file8
> DEF.file10 DEF.file3 DEF.file5 DEF.file7 DEF.file9
转变
因此,GNU tar
将接受sed --transform=EXPRESSION
文件重命名。这甚至只能重命名一些文件。例如:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC\(.*[0-5]\)/DEF\1/' -xf -
% ls ../test2
> ABC.file6 ABC.file8 DEF.file1 DEF.file2 DEF.file4
> ABC.file7 ABC.file9 DEF.file10 DEF.file3 DEF.file5
这就是优势之一。
流
还请注意,这只是两个tar
过程-无论文件数量如何,该过程都不会改变。
tar | tar
tar
已达到您想要的最佳化。这样永远不会有问题参数计数或失控的子进程。这只是A> B完成的。
争论
在tar
这里,我在两个过程之间使用了7个不同的参数。最重要的一个在这里首先列出:
-
标准输出/标准输入 -这通知tar
,它将它的任一输入或输出流或从stdin/stdout
它将正确地解释这取决于它是否被建立或提取归档文件。
-c
创建 -这告诉tar
建立档案。下一个参数tar
期望是...
-f
文件 -我们指定tar
将使用file
对象而不是磁带设备或其他任何东西。如上所述,它将使用的文件是stdin/stdout
- |pipe
。
./*
所有$ PWD / files-在这里无需过多解释,除了archive参数首先出现,-
然后是./*
。
...和的另一边|pipe
......
-C
更改目录 -这tar
表明在执行任何其他操作之前需要将其更改为我指定的目录,因此cd ../test2
在提取之前必须有效。
--transform='s/ed/EXPR/'
-正如已经提到的,此操作已重命名。但是文档表明它可以采用任何sed
表达式或//flag
。
-x
提取 - tar
更改目标目录并收到重命名说明后,我们指示它开始从-f - |pipe
存档文件中将所有文件提取到其当前目录中。没有神秘感。
mc
文件管理器对这种批量重命名提供了最广泛的支持。