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)
您可以mcp
从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)