Copie e cole um monte de arquivos com nome diferente

10

Eu tenho um monte de arquivos de texto com o nome

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

Gostaria de copiar (e manter os arquivos originais) cada arquivo e colar com nomes diferentes (na mesma pasta), como,

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

Como posso fazer isso usando um script simples?

fenômeno
fonte

Respostas:

13

Mude o diretório para onde você tem os arquivos originais.

Em seguida, teste com a seguinte linha de comando,

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

e se parecer bom, remova echoe faça a cópia,

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

Você pode usar mcpdo mmvpacoteInstalar mmv da seguinte maneira:

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

Isso copiará todos os arquivos que contêm a string "original" no diretório atual e substituirá essa string por "copy". Você pode testar o que mcpfará adicionando o -nsinalizador, mas ele não substituirá silenciosamente os arquivos, mas solicitará. O uso mmvtem a vantagem de cpque você não precisa chamá-lo para cada arquivo - com mil arquivos como você parece copiar, isso faz a diferença.

Você também pode usar o GNUparallel Instalar paralelo da seguinte maneira ( --dry-runé para testar, remova-o para realizar a cópia):

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

ou, se isso der o erro "A lista de argumentos é muito longa":

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

Exemplo de execução

$ 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

Vamos timelá, execute mais de 1000 arquivos de 100 KiB cada um em uma máquina lenta :

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