Copie e cole um monte de arquivos com nomes diferentes

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

Eu gostaria de copiar (e manter os arquivos originais) cada arquivo e colar para 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?

    
por phenomenon 09.06.2018 / 07:18

2 respostas

13

Altere 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 estiver bom, remova echo e copie,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
    
por sudodus 09.06.2018 / 08:32
8

Você pode usar mcp do mmv package da seguinte maneira:

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

Isto irá copiar todos os arquivos contendo a string “original” no diretório atual e substituir esta string por “copy”. Você pode testar o que o mcp fará adicionando o -n , mas ele não substituirá os arquivos silenciosamente, mas perguntará. Usar mmv tem a vantagem sobre cp que você não precisa chamar para cada arquivo - com mil arquivos como você parece copiar, isso faz a diferença.

Você também pode usar GNU parallel daseguintemaneira(--dry-runéparateste,remova-opararealizaracópia):

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

ou, se isso fornecer o erro "Argument list too long":

printf "%s
$ 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
" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"

Exemplo de execução

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

Vamos time , executar mais de 1000 arquivos de 100 KiB cada em uma máquina lenta :

mcp "*original*" "#1copy#2"
    
por dessert 09.06.2018 / 09:39