复制并粘贴一堆名称不同的文件


10

我有一堆名字叫文本的文件

foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
...
...
foo_bar_abc_1_1000_geh_original.in

我想复制(并保留原始文件)每个文件,然后粘贴到不同的名称(在同一文件夹中),例如

foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_03_geh_copy.in
...
...
foo_bar_abc_1_1000_geh_copy.in

如何使用简单的脚本执行此操作?

Answers:


13

将目录更改为原始文件所在的目录。

然后使用以下命令行进行测试,

for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done

如果看起来不错,请删除echo并进行复制,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done

8

您可以通过以下方式mcpmmv安装mmv中使用:

mcp "*original*" "#1copy#2"

这将在当前目录中复制每个包含字符串“ original”的文件,并将该字符串替换为“ copy”。您可以mcp通过添加-n标志来测试将执行的操作,但是该标志不会静默地覆盖文件,而是会询问您。使用mmv具有优点,cp因为您不必为每个文件都调用它-好像您要复制一千个文件,这有所作为。

您还可以通过以下方式使用GNUparallel 并行安装--dry-run用于测试,请将其删除以执行复制):

parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *

或者,如果这样给出“参数列表过长”错误:

printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"

运行示例

$ ls -1
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_original.in
$ mcp "*original*" "#1copy#2"
$ ls -1
foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_copy.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_copy.in
foo_bar_abc_1_04_geh_original.in

让我们time慢速的计算机上运行1000个文件,每个文件100 KiB :

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.