Каков наилучший способ присоединиться к файлам снова после их разделения?

Если у меня большой файл и нужно разбить его на 100 мегабайт, я сделаю

split -b 100m myImage.iso 

Это обычно дает мне что-то вроде

 xaa xab xac xad 

И чтобы вернуть их вместе, я использую

 cat x* > myImage.iso 

Похоже, что должен быть более эффективный способ, чем чтение каждой строки кода в группе файлов с cat и перенаправление вывода в новый файл. Как способ просто открыть два файла, удалить маркер EOF с первого и связать их – без необходимости проходить через все содержимое.

Windows / DOS имеет команду копирования для двоичных файлов. В справочной системе упоминается, что эта команда предназначена для возможности объединения нескольких файлов. Он работает с этим синтаксисом: ( /b для двоичного режима)

 copy /b file1 + file2 + file3 outputfile 

Есть ли что-то подобное или лучший способ присоединиться к большим файлам на Linux, чем кошка?

Обновить

Кажется, что cat на самом деле является правильным способом и лучшим способом присоединиться к файлам. Рад узнать, что я использовал правильную команду все время 🙂 Спасибо всем за ваши отзывы.

5 Solutions collect form web for “Каков наилучший способ присоединиться к файлам снова после их разделения?”

Это то, к чему cat была создана. Поскольку это один из старейших инструментов GNU, я думаю, что вряд ли любой другой инструмент сделает это быстрее / лучше. И это не трубопровод – это только перенаправление вывода.

Под капотом

Нет более эффективного способа, чем копирование первого файла, затем копирование второго файла после него и т. Д. И copy DOS, и cat делают это.

Каждый файл хранится независимо от других файлов на диске. Почти каждая файловая система, предназначенная для хранения данных на дискеподобном устройстве, работает по блокам. Вот очень упрощенная презентация того, что происходит: диск делится на блоки, скажем 1kB, и для каждого файла операционная система хранит список блоков, которые его составляют. Большинство файлов не являются целым числом блоков, поэтому последний блок занят лишь частично. На практике файловые системы имеют множество оптимизаций, таких как разделение последнего частичного блока между несколькими файлами или сохранение «блоков 46798 – 47913», а не «блок 46798, блок 46799, …». Когда операционной системе необходимо создать новый файл, он ищет свободные блоки. Блоки не обязательно должны быть последовательными: если только блоки 4, 5, 98 и 178 бесплатны, вы все равно можете сохранить файл 4 КБ. Использование блоков, а не переход на уровень байтов помогает значительно быстрее находить свободные блоки для нового или растущего файла и уменьшает проблемы из-за фрагментации при создании или выращивании, удалении или сокращении большого количества файлов (оставляя все большее количество отверстия).

Вы можете поддерживать частичные блоки в середине файла, но это добавит значительную сложность, особенно при обращении к файлам не последовательно: чтобы перейти к 10340-му байту, вы больше не сможете переходить на 100-й байт 11-го блока, для проверки длины каждого промежуточного блока.

Учитывая использование блоков, вы не можете просто присоединиться к двум файлам, потому что, как правило, первый файл заканчивается в середине блока. Конечно, у вас может быть специальный случай, но только если вы хотите удалить оба файла при конкатенации. Это будет очень специфическая обработка для редкой операции. Такая специальная обработка не живет сама по себе, потому что в типичной файловой системе одновременно осуществляется обращение к множеству файлов. Поэтому, если вы хотите добавить оптимизацию, вам нужно тщательно подумать: что произойдет, если какой-либо другой процесс читает один из файлов? Что произойдет, если кто-то попытается объединить A и B, пока кто-то конкатенирует A и C? И так далее. В общем, эта редкая оптимизация будет огромной нагрузкой.

В общем, вы не можете сделать файлы присоединения более эффективными, не жертвуя в других местах. Это не стоит.

О разделении и присоединении

split и cat – это простые способы разделения и объединения файлов. split заботится о создании файлов, названных в алфавитном порядке, так что cat * работает для присоединения.

Недостатком cat для соединения является то, что она не устойчива к общему режиму отказа. Если один из файлов усечен или отсутствует, cat не будет жаловаться, вы просто получите поврежденный вывод.

Существуют утилиты сжатия, которые создают zipsplit архивы, такие как zipsplit и rar -v . Они не очень несовместимы, потому что они сжимают и упаковывают (собирают несколько файлов в один) в дополнение к расщеплению (и наоборот распаковывают и распаковывают в дополнение к соединению). Но они полезны в том, что они проверяют, что у вас есть все части, и что детали полны.

Похоже, что должен быть более эффективный способ, чем прокладка всего содержимого через stdin / stdout

Кроме того, это не совсем то, что происходит. Оболочка подключает stdout cat непосредственно к открытому файлу, что означает, что «переход через stdout» совпадает с записью на диск.

У меня когда-то была именно эта проблема: я хотел присоединиться к некоторым файлам, но не имел достаточного дискового пространства, чтобы удерживать их вдвойне.

Поэтому я написал множество программ:

  • один, чтобы «сосать» файл, прочитав его, отправив его на stdout и, если закончите, удалив его
  • и один для буферизации данных «на лету».

Это позволило мне сделать что-то вроде

 partto sourcefile | mybuffer 128M >>cumufile 

и, таким образом, удаление исходного файла, в то время как 128M все еще неписано. Немного опасно, но если данные не так ценны, или они существуют где-то еще, это возможно.

При необходимости я могу предоставить источник.

С технической точки зрения, это способ доступа ко всему файлу без чтения и записи всего содержимого и может быть полезен для огромных файлов или если осталось немного свободного места:

 $ mkfifo myImage.iso $ cat xa{a..g} > myImage.iso & 

И затем используйте myImage.iso , например

 $ md5sum myImage.iso 

Хотя, конечно, myImage.iso – это специальный файл (named pipe), а не обычный файл, поэтому это может быть myImage.iso или не в зависимости от того, что вы пытаетесь сделать.

  • Есть ли способ разделить HTML-файл, не теряя при этом все форматирование в каждом сегменте?
  • Разделение файла по размеру, но убедитесь, что оно заканчивается символом новой строки
  • Разделить двоичные данные фиксированного байтового смещения по байтовой позиции?
  • Надежная сегментация csv-файла, содержащего шумные данные
  • Разделить входной файл на X частей общего количества строк / X
  • разделить файл на две части, по шаблону
  • Разделить текстовый файл на строки с фиксированным числом слов
  • TAR: лучше пропустить каталог или использовать split
  • печать специальных символов в awk-выходе
  • Как преобразовать файл TTA и его лист CUE в несколько файлов FLAC?
  • Разделить текстовый файл по строке и переименовать на основе содержимого строки
  • Разделить разделенный запятыми список, игнорирующий запятые в соответствии с {}
  • Interesting Posts

    bash исчерпает память

    KVM – Как удалить виртуальную видеокарту, но сохранить SPICE Server?

    Kali Linux – «пакет не имеет кандидата на установку» (также thinkpad-acpi)

    Как настроить локальный поиск и доставку почты?

    Каков самый простой способ добавить строку в начале каждой строки файла из командной строки?

    Ошибка трассировки python3

    Инструмент для сравнения файлов на одном диске с информацией о реестре на другом?

    Как переустановить USB-накопитель после размонтирования Nautilus без его отсоединения?

    Сравните старый файл и новый файл, но игнорируйте строки, которые существуют только в новом файле?

    Определите изменение скорости передачи данных в формате USB и журнал.

    Debian – новейшая версия Eclipse

    Как настроить вино для создания сетей в Linux

    Как перекомпилировать 2 миллиона файлов gzip, не сохраняя их дважды?

    Оверлей файловой системы Linux – для чего используется workdir? (OverlayFS)

    Команда Ping приводит к потере пакетов

    Linux и Unix - лучшая ОС в мире.