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

phe*_*non 10 command-line cp text-processing

我有一堆同名的文本文件

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

sud*_*dus 13

将目录更改为您拥有原始文件的位置。

然后用下面的命令行测试,

for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done
Run Code Online (Sandbox Code Playgroud)

如果它看起来不错,删除echo并复制,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
Run Code Online (Sandbox Code Playgroud)


des*_*ert 8

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

mcp "*original*" "#1copy#2"
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用GNUparallel 平行安装按以下方式(--dry-run用于测试,将其删除以执行复制):

parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *
Run Code Online (Sandbox Code Playgroud)

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

printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"
Run Code Online (Sandbox Code Playgroud)

示例运行

$ 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
Run Code Online (Sandbox Code Playgroud)

让我们time在一台慢速机器上运行超过 1000 个 100 KiB 的文件:

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
Run Code Online (Sandbox Code Playgroud)