¿Cómo copiar un determinado archivo varias veces con un final regular?

13

Tengo un solo archivo (un PDF) y quiero tener muchas copias idénticas en la misma carpeta (200 sería bueno) file-001, file-002etc.

¿Cómo lo hago?

Tim
fuente
No, es para corregir errores.
Tim
El _ es un error tipográfico, espero?
Rinzwind
@Rinzwind, sí! eso podría ser interesante: ¿elegir un personaje aleatorio para cada uno? : p
Tim
@Tim: Bueno, para generar un aleatorio "_" o "-" puedes printf "%s\n" "$(cat /dev/urandom | tr -dc '_-' | fold -w 1 | head -n 1 )":-P (y ten en cuenta que es una lata de gusanos, porque echo -es uno de estos casos de esquina ...)
Rmano
1
@Rmano Me quedaré con -creo: P
Tim

Respuestas:

22

Podrías hacer algo como

< file tee file-{001..200}

sin embargo, si el medio se vuelve ilegible, no importará cuántas copias tenga, fundamentalmente las copias de seguridad requieren diversidad .

Tenga en cuenta que teeescribe su entrada estándar en la salida estándar, así como en cada uno de los archivos dados: para archivos grandes o para archivos que contienen datos binarios u otros caracteres especiales que pueden interferir con la configuración de su terminal, es probable que desee volcar la salida estándar a el cubo de bits

< file > /dev/null tee file-{001..200}
conductor de acero
fuente
44
tee file-{001..200} < file >/dev/nullme busca de manera más legible. Vea esta respuesta casi duplicada: ¿Cómo copiar un archivo a varias carpetas en Terminal?
Radu Rădeanu
21

Este es el caso clásico donde los trucos de shell ayudan mucho.

for i in {000..199}; do cp file file-$i; done

Y sé que es una broma , pero si quieres un número aleatorio _o -separando el número del nombre puedes usar:

for i in {000..199}; do 
    cp file file$(cat /dev/urandom | tr -dc '_-' | fold -w 1 | head -n 1 )$i; 
done

(línea múltiple para ayudar a la legibilidad ...)

:-PAG

Rmano
fuente
1
¿Qué pasa si quisiera que cada número primo fuera un _y cada no primo fuera -? 1 no es primo, ¡y eliges por 0! : P Chistes!
Tim
7

Para hacer un solo duplicado de un archivo, probablemente sepa que puede usar cp:

cp file file-001

Ahora, para hacer más duplicados en un archivo, puede combinar cpcon xargs. En tu caso:

echo file-{001..200} | xargs -n 1 cp file

copiará filea file-001, file-002, ..., file-200. Ver man xargspara más información.

Radu Rădeanu
fuente
4

Como siempre, el camión Python llega tarde, pero:

hacerlo ejecutable, arrástrelo sobre una ventana de terminal, arrastre el archivo para copiar sobre la ventana de terminal y establezca el número de copias:

script file number_ofcopies

El número de ceros a la izquierda se ajusta automáticamente, los archivos se denominan file_001.pdf, file_002.pdfcon los filenumbers colocan antes de la extensión.

La secuencia de comandos:

#!/usr/bin/env python3

import sys
import shutil

orig = sys.argv[1]; n = sys.argv[2]; size = len(str(n)); out = (orig[:orig.rfind(".")], orig[orig.rfind("."):])
for item in [out[0]+"_"+(size-len(str(item)))*"0"+str(item)+out[1] for item in range(1, int(n)+1)]:
    shutil.copyfile(orig, item)
Jacob Vlijm
fuente
Sí, probé con python antes, pero no me gustó la inelegancia ... Normalmente voy por python :)
Tim
@Tim Debe ser la fuente del código en este sitio lo que dificulta la belleza del código de python :)
Jacob Vlijm
1
Hay varias formas de hacer esto.
Braiam