Jak skopiować określony plik kilka razy z regularnym zakończeniem?

13

Mam jednego pliku (PDF) i chcę mieć dużo identycznych kopii w tym samym folderze (200 byłoby miło) o nazwie file-001, file-002etc.

Jak mam to zrobić?

Tim
źródło
Nie, służy do korekcji błędów.
Tim
Mam nadzieję, że _ jest literówką?
Rinzwind
@Rinzwind tak! to może być interesujące - wybrać losową postać dla każdego? : p
Tim
@Tim: Cóż, aby wygenerować losowe „_” lub „-”, możesz printf "%s\n" "$(cat /dev/urandom | tr -dc '_-' | fold -w 1 | head -n 1 )":-P (i ostrzegać, że to puszka robaków, ponieważ echo -jest to jeden z tych narożnych przypadków ...)
Rmano
1
@ Romano Będę się trzymać -, myślę: P
Tim

Odpowiedzi:

22

Możesz zrobić coś takiego

< file tee file-{001..200}

jednak jeśli nośnik stanie się nieczytelny, nie będzie miało znaczenia, ile kopii na nim znajduje się - zasadniczo kopie zapasowe wymagają różnorodności .

Zauważ, że teezapisuje standardowe wejście na standardowe wyjście, a także na każdym z podanych plików - w przypadku dużych plików lub plików zawierających dane binarne lub inne znaki specjalne, które mogą zakłócać ustawienia terminala, prawdopodobnie będziesz chciał zrzucić standardowe wyjście na łyżka do bitów

< file > /dev/null tee file-{001..200}
steeldriver
źródło
4
tee file-{001..200} < file >/dev/nullszuka mnie bardziej czytelnie. Zobacz tę prawie zduplikowaną odpowiedź: jak skopiować plik do wielu folderów w terminalu?
Radu Rădeanu
21

Jest to klasyczny przypadek, w którym bardzo pomocne są sztuczki z muszli.

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

I wiem, że to żart , ale jeśli chcesz losowy _lub -oddzielając numer z nazwy można użyć:

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

(wiele linii, aby poprawić czytelność ...)

:-P

Rmano
źródło
1
Co jeśli chciałbym, aby każda liczba pierwsza była liczbą _a każda poza liczbą pierwszą -? 1 nie jest liczbą pierwszą, a ty wybierasz za 0! : P Żarty!
Tim
7

Aby utworzyć pojedynczy duplikat pliku, prawdopodobnie wiesz, że możesz użyć cp:

cp file file-001

Teraz, aby zrobić więcej duplikatów w pliku, możesz łączyć cpz xargs. W Twoim przypadku:

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

skopiuje filedo file-001, file-002, ..., file-200. Zobacz man xargswięcej informacji.

Radu Rădeanu
źródło
4

Jak zawsze ciężarówka pytona spóźnia się, ale:

uczyń go wykonywalnym, przeciągnij go nad oknem terminala, przeciągnij plik do skopiowania przez okno terminala i ustaw liczbę kopii:

script file number_ofcopies

Liczba zer wiodących jest ustawiana automatycznie, pliki są nazywane file_001.pdf, file_002.pdfze te filenumbers umieszczony przed rozszerzeniem.

Scenariusz:

#!/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
źródło
Tak, próbowałem wcześniej z pythonem, ale nie podobała mi się ta nieelegancja ... Zwykle wybieram pytona :)
Tim
@Tim To musi być czcionka kodu na tej stronie, która utrudnia ładność kodu python :)
Jacob Vlijm
1
Można to zrobić na kilka sposobów.
Braiam