Copie y pegue un montón de archivos con un nombre diferente

10

Tengo un montón de archivos de texto con el nombre

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

Me gustaría copiar (y mantener los archivos originales) cada archivo y pegarlo en diferentes nombres (en la misma carpeta) 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

¿Cómo puedo hacer esto usando un script simple?

fenómeno
fuente

Respuestas:

13

Cambie el directorio a donde tiene los archivos originales.

Luego pruebe con la siguiente línea de comando,

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

y si se ve bien, elimine echoy haga la copia,

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

Puede usarlo mcpdesde el mmvpaqueteInstalar mmv de la siguiente manera:

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

Esto copiará cada archivo que contenga la cadena "original" en el directorio actual y reemplazará esta cadena con "copia". Puede probar qué mcphará agregando la -nbandera, sin embargo, no sobrescribirá silenciosamente los archivos, sino que le preguntará. El uso mmvtiene la ventaja sobre cpque no tiene que llamarlo para cada archivo individual; con mil archivos como parece copiar, eso hace la diferencia.

También puede usar GNUparallel Instalar paralelo de la siguiente manera ( --dry-runes para probar, eliminarlo para realizar la copia):

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

o, si eso da el error "Lista de argumentos demasiado larga":

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

Ejecución de ejemplo

$ 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 timea ejecutar más de 1000 archivos de 100 KiB cada uno en una máquina lenta :

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