Como copiar um determinado arquivo várias vezes com um final regular?

13

Eu tenho um arquivo único (a PDF) e eu quero ter muitas cópias idênticas na mesma pasta (200 seria bom) chamado file-001, file-002etc.

Como eu faço isso?

Tim
fonte
Não, é para correção de erros.
Tim
O _ é um erro de digitação, espero?
Rinzwind 26/08/14
@Rinzwind yeah! isso pode ser interessante - escolha um caractere aleatório para cada um? : p
Tim
@ Tim: Bem, para gerar um aleatório "_" ou "-" você pode printf "%s\n" "$(cat /dev/urandom | tr -dc '_-' | fold -w 1 | head -n 1 )":-P (e ser avisado de que é uma lata de minhocas, porque echo -é um destes casos de canto ...)
Rmano
1
@Rmano eu vou ficar com -eu acho: P
Tim

Respostas:

22

Você poderia fazer algo como

< file tee file-{001..200}

no entanto, se a mídia ficar ilegível, não importará quantas cópias houver - fundamentalmente, os backups exigem diversidade .

Observe que teegrava sua entrada padrão na saída padrão e em cada um dos arquivos fornecidos - para arquivos grandes ou arquivos que contêm dados binários ou outros caracteres especiais que podem interferir nas configurações do terminal, você provavelmente desejará despejar a saída padrão para o balde de bits

< file > /dev/null tee file-{001..200}
chave de aço
fonte
4
tee file-{001..200} < file >/dev/nullolha para mim de forma mais legível. Veja esta resposta quase duplicada: Como copiar um arquivo para várias pastas no Terminal?
Radu Rădeanu
21

Este é o caso clássico em que os truques de shell ajudam muito.

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

E eu sei que é uma piada , mas se você quiser aleatoriamente _ou -separar o número do nome, poderá usar:

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

(várias linhas para facilitar a legibilidade ...)

:-P

Rmano
fonte
1
E se eu quisesse que todo número primo fosse um _e todo não primo fosse -? 1 não é primo e você escolhe 0! : P Piadas!
Tim
7

Para criar uma única duplicata de um arquivo, você provavelmente sabe que pode usar cp:

cp file file-001

Agora, para criar mais duplicatas em um arquivo, você pode combinar cpcom xargs. No seu caso:

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

irá copiar filepara file-001, file-002, ..., file-200. Veja man xargspara mais informações.

Radu Rădeanu
fonte
4

Como sempre, o caminhão python chega tarde, mas:

torne-o executável, arraste-o sobre uma janela do terminal, arraste o arquivo para copiar sobre a janela do terminal e defina o número de cópias:

script file number_ofcopies

O número de zeros à esquerda é definida automaticamente, os arquivos são nomeados file_001.pdf, file_002.pdfcom os filenumbers colocado antes da extensão.

O script:

#!/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
fonte
Sim, eu tentei com python mais cedo, mas não gostou da deselegância ... Eu normalmente ir para python :)
Tim
@ Tim Deve ser a fonte do código no local que impede a Prettyness do código python :)
Jacob Vlijm
1
Existem várias maneiras de fazer isso.
Braiam 27/08/14