bash: как быстро скопировать несколько копий одного файла в другой?
Мне нужно провести стресс-тестирование программы, загрузив в нее входные файлы все большего размера. У меня есть входной файл inputSmall.txt , который я хочу воспроизвести N раз и cat эти копии в один и тот же файл. N — большой файл. Если есть что-то, что будет работать быстрее, чем следующий простой цикл (например, N=1000 ):
На моей машине достаточно места на диске для хранения inputN.txt очень больших N и много оперативной памяти, если это необходимо.
3 ответа
cat — это внешняя команда, а не часть оболочки; как и все внешние команды, его запуск требует значительных накладных расходов. Точно так же выполнение >>input1000.txt — довольно дорогостоящая операция файловой системы — поиск inode, связанного с каталогом, его открытие, а затем (при выходе из области видимости) очистка содержимого и закрытие файла.
Гораздо эффективнее сделать это только один раз.
Предполагая, что последняя строка inputSmall.txt заканчивается новой строкой, следующее будет работать правильно и с гораздо меньшими накладными расходами:
Таким образом вы можете сделать это быстрее и «экспоненциально», но вам понадобится дополнительное дисковое пространство для файла tmp.
Одновременное копирование одного файла в несколько мест через командную строку Ubuntu
Как новичку в командной строке, вам может показаться, что та же задача, которую вы быстро выполняли с помощью графического интерфейса, может потребовать большого количества команд в командной строке. Однако, постепенно становясь опытным пользователем командной строки путем обучения, практики и опыта, вы начнете замечать, что те же задачи можно выполнять очень быстро с помощью некоторых простых, но полезных сочетаний клавиш. В этой статье мы опишем один из таких случаев, когда, казалось бы, нужно выполнить множество команд, но на самом деле одна простая команда может решить эту задачу.
Иногда нам требуется скопировать один файл в несколько мест в нашей системе. Значит ли это, что нам нужно использовать команду cp несколько раз? Ответ — нет! Давайте читать дальше, чтобы найти решение.
Как скопировать один файл одновременно в несколько мест
Все мы знаем, как команда cp позволяет нам скопировать файл в новое место, используя следующий синтаксис:
Здесь я копирую файл из папки Documents в папку Downloads:
Теперь, если я хочу скопировать один и тот же файл в два разных места вместо одного, вероятным решением будет использование команды cp дважды.
Здесь я использую команду cp дважды, чтобы скопировать образец текстового файла из папки Downloads в папки Public и Desktop:

Копирование одного и того же файла в два места с помощью команды cp дважды кажется логичным, но предположим, что нам нужно скопировать файл в три, пять или даже больше мест. Вот как одна команда может достичь этой цели.
В следующем примере я использую эту команду для одновременного копирования текстового файла из папки Downloads в три разные папки:

Мы использовали команду echo и команду xargs в одной строке для достижения нашей цели.
Как работает эта команда?
Команда echo печатает вывод на экран, но в нашем примере мы используем ее для передачи вывода команде xargs через символ |. Команда xargs трижды примет входные данные от команды echo и трижды выполнит операцию cp, копируя текст образца в три разных места. Счетчик n указывает команде cp принимать по одному аргументу за раз.
Обратите внимание, что эта команда перезапишет уже существующий файл с тем же именем в папке назначения. Поэтому рекомендуется всегда делать резервные копии важных файлов. Опция i, которую мы использовали для запроса перед операцией перезаписи, не работает с командой xargs.
Однако есть один вариант использования команды, который может помочь вам избежать перезаписи файла, если он уже существует в папке назначения; опция n перед исходным файлом.

Опция n очень полезна при копировании очень больших файлов из одного места в другое, особенно по сети. Так вы сможете избежать траты ресурсов на копирование и последующую замену уже существующего файла.
Теперь вам не нужно писать несколько команд для выполнения простой задачи — копирования одного файла в разные места. Вы можете объединить команды echo и xargs, как мы описали, чтобы получить однокомандное решение вашей проблемы.
Команда COPY для копирования одного или нескольких файлов.
Команда COPY при работе в командной строке позволяет копировать один или несколько файлов. Команда имеет синтаксис: COPY[/D][/V][/N][/Y | /-Y][/Z][/L][/A | /B]источник[/A | /B][+ источник[/A | /B] [+ . ]][результат [/A | /B]]. Источником является имя копируемого файла, а результатом является каталог, в который будет помещена копия этого файла и/или имя создаваемого файла.
Для примера, создадим на диске «С» какой-нибудь файл (я создал текстовый файл «robot.txt»), а на диске «D» какую-нибудь папку (я создал папку «folder1»). Тогда команда для копирования файла «robot.txt» в папку «folder1» выглядит так: copy robot.txt d:\folder1

Если необходимо скопировать файл, изменив при этом его имя, необходимо записать следующую команду: copy robot.txt d:\folder1\file.txt В этом случае, файл «robot.txt» будет скопирован в папку «folder1», но уже с именем «file.txt».

Для того чтобы скопировать все файлы с выбранным расширением, необходимо вместо названия файла поставить звездочку «*». Например, создадим на диске «С» какую-нибудь папку (я создал папку «papka») и скопируем в нее все текстовые файлы из папки «folder1», расположенной на диске «D». Команда будет иметь вид: copy d:\folder1\*.txt c:\papka
Если в качестве [результата] не указывать каталог, то команда copy скопирует файл (или файлы) и поместит их в текущем каталоге. При этом скопированные файлы будут иметь то же имя, дату и время создания, что и исходный файл. Например, создадим в папке «folder1», расположенной на диске «D» текстовый файл с именем «robot1.txt». После этого в командной строке изменим текущий каталог с «C:\>» на «C:\Papka». Тогда команда copy d:\folder1\robot1.txt скопирует файл «robot1.txt» из папки «folder1» и поместит его в текущем каталоге, т.е. в папку «papka», расположенную на диске «C». Причем, имя, дата и время создания скопированного файла будет идентично исходному файлу.
Для того чтобы скопировать все файлы из определенного каталога, необходимо вместо названия файла поставить звездочку «*» и вместо расширения файла поставить звездочку «*». Например, создадим в папке «folder1» несколько файлов, имеющих различные расширения (документ Word, архив Rar и т.д.). Тогда команда для копирования всех файлов из папки «folder1» на диск «C» будет выглядеть: copy d:\folder1\*.* c:\
[Источником] или [результатом] копирования могут выступать не только файлы, но и различные устройства компьютера. В Windows поддерживаются следующие имена устройств:
- LPT1 – LPT3 (параллельные порты).
- COM1 – COM3 (последовательные порты).
- CON (терминал, при выводе это экран компьютера, при вводе – клавиатура).
- PRN (принтер).
- AUX (устройство, подсоединяемое к последовательному порту 1).
Например, с помощью командной строки и команды «copy» можно создать текстовый файл и записать в него информацию: copy con f1.txt . Команда copy con f1.txt создаст текстовый файл «f1.txt» и скопирует в него символы, которые вы будете вводить с клавиатуры.
После ввода команды copy con f1.txt нажимаем Enter и вводим слова, которые необходимо сохранить (я ввел command com). После ввода необходимо поставить признак конца файла (нажать Ctrl+Z).
C помощью команды copy можно объединять несколько файлов в один файл. Например, создадим на диске «C» два файла f2.txt и f3.txt (файл f1.txt мы создали ранее) и запишем в эти файлы какую-нибудь информацию. Тогда команда copy f1.txt+f2.txt+f3.txt d:\f4.txt скопирует содержимое файлов «f1.txt», «f2.txt», «f3.txt» в файл «f4.txt», который будет автоматически создан на диске «D».
Если при объединении файлов не указывать файл — [результат], то вся информация будет сохранена в первом файле. Например, команда copy f1.txt+f2.txt+f3.txt добавит к содержимому файла f1.txt содержимое файлов f2.txt и f3.txt
Ключ /Y отключает вывод сообщения о замене файлов. По умолчанию, при копировании файлов, если такой файл существует, то на экран выводится сообщение с предупреждением о замене. Пользователь может согласиться с заменой (нажать Y) или не согласиться (нажать N). Ключ /Y отключает это сообщение и копирование происходит сразу. Для примера создадим на диске «C» файл vov.txt и скопируем его на диск «D»: copy vov.txt d:\
Затем скопируем этот файл еще раз. При этом выводится сообщение «Заменить d:\vov.txt [Yes (да)……»
После этого скопируем файл еще раз, употребив ключ /Y. Сообщение выводиться не будет.

Ключ /Y может присутствовать в значении переменной среды окружения COPYCMD. Т.е. по умолчанию, при замене файлов сообщение выводиться не будет. В этом случае, для того чтобы сообщение выводилось необходимо использовать ключ /-Y.