我有一堆文本文件,名称为
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
包裹方式如下:
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