Як скопіювати певний файл кілька разів із звичайним закінченням?


13

У мене є один файл (PDF), і я хочу мати в одній папці безліч однакових копій (200 було б непогано), названих file-001і file-002т.д.

Як це зробити?


Ні, це для виправлення помилок.
Тім

_ - це друкарська помилка?
Rinzwind

@Rinzwind так! що може бути цікаво - виберіть випадкового персонажа для кожного? : p
Тім

@Tim: Ну, генерувати випадкові "_" або "-", ви можете printf "%s\n" "$(cat /dev/urandom | tr -dc '_-' | fold -w 1 | head -n 1 )":-P (і попередити, що це може бути echo -
черв'як

1
@Rmano Я буду дотримуватися, -я думаю: P
Тім

Відповіді:


22

Ви могли зробити щось подібне

< file tee file-{001..200}

однак, якщо носій стане нечитабельним, неважливо, скільки копій на ньому - принципово, резервні копії вимагають різноманітності .

Зауважте, що teeзаписуючи його стандартний вхід на стандартний вихід, а також у кожен із заданих файлів - для великих файлів або для файлів, що містять двійкові дані або інші спеціальні символи, які можуть заважати налаштуванням вашого терміналу, ви, ймовірно, захочете скинути стандартний вихід на відро біт

< file > /dev/null tee file-{001..200}

4
tee file-{001..200} < file >/dev/nullшукає мене більш розбірливо. Дивіться цю майже повторювану відповідь: Як скопіювати файл у кілька папок у Terminal?
Radu Rădeanu

21

Це класичний випадок, коли хитрощі з оболонками дуже допомагають.

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

І я знаю, що це жарт , але якщо ви хочете випадкове _або -відокремити число від імені, ви можете використовувати:

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

(кілька рядків для полегшення читабельності ...)

:-P


1
Що робити, якби я хотів, щоб кожне просте число було _і кожне, що не є простим -? 1 не є простим, і ви вибираєте 0! : P Жарти!
Тім

7

Щоб створити єдиний дублікат файлу, ви, мабуть, знаєте, що можете використовувати cp:

cp file file-001

Тепер, щоб зробити більше дублікатів у файл, ви можете комбінувати cpїх xargs. У вашому випадку:

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

скопіює fileдо file-001, file-002..., file-200. Див. Для man xargsотримання додаткової інформації.


4

Як завжди, вантажівка пітона приходить пізно, але:

зробіть його виконуваним, перетягніть його через вікно терміналу, перетягніть файл для копіювання через термінальне вікно та встановіть кількість копій:

script file number_ofcopies

Кількість провідних нулів встановлюються автоматично, файли з ім'ям file_001.pdf, file_002.pdf, з filenumbers поміщається перед тим розширенням.

Сценарій:

#!/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)

Так, я спробував з python раніше, але мені не сподобалася неелегантність ... Я, як правило, йду на python :)
Тім

@Tim Це повинен бути шрифт коду на цьому веб-сайті, який заважає красивості пітонного коду :)
Jacob Vlijm

1
Існує кілька способів зробити це.
Брайам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.