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

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

我有一堆文本文件,名称为

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

如何使用简单的脚本来实现这一点?

答案1

将目录更改为保存原始文件的目录。

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

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

答案2

您可以mcp使用mmv包裹安装 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我们在慢的机器:

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s

相关内容