Copia e incolla un mucchio di file con un nome diverso


10

Ho un sacco di file di testo con il 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

Vorrei copiare (e conservare i file originali) ogni file e incollarlo con nomi diversi (nella stessa cartella) come,

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

Come posso farlo usando un semplice script?

Risposte:


13

Passa alla directory in cui hai i file originali.

Quindi prova con la seguente riga di comando,

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

e se sembra buono, rimuovi echoed esegui la copia,

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

8

È possibile utilizzare mcpdal mmvpacchettoInstalla mmv nel modo seguente:

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

Questo copierà ogni file contenente la stringa "originale" nella directory corrente e sostituirà questa stringa con "copia". Puoi testare cosa mcpfarà aggiungendo il -nflag, tuttavia non sovrascriverà silenziosamente i file, ma ti chiederà. L'utilizzo mmvha il vantaggio cpdi non doverlo chiamare per ogni singolo file: con un migliaio di file che sembra copiare, questo fa la differenza.

È inoltre possibile utilizzare GNUparallel Installa in parallelo nel modo seguente ( --dry-runè per il test, rimuoverlo per eseguire la copia):

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

o, se ciò dà l'errore "Elenco argomenti troppo lungo":

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

Esempio di esecuzione

$ 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

Facciamolo time, esegui oltre 1000 file da 100 KiB ciascuno su una macchina lenta :

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.