Если у меня большой файл и мне нужно разбить его на 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?
Обновить
Кажется, что cat
это действительно правильный и лучший способ объединения файлов. Рад, что я все время использовал правильную команду :) Спасибо всем за ваши отзывы.
cat x*
, потому что порядок файлов зависит от настроек вашего языка. Лучше начать печататьcat x
, чем нажать Esc, а затем*
- вы увидите расширенный порядок файлов и сможете изменить порядок.cat x*
вы можете рассмотреть расширение оболочки скобки,cat xa{a..g}
которое расширяет указанную последовательность доcat
xaa xab xac xad xae xaf xagcat x*
? Будет ли новая установка локали также не влияет ,split
так что еслиsplit
иcat x*
были использованы в той же системе , что они всегда будут работать?split.c
в GNU Coreutils, суффиксы построены из фиксированного массива символов:static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz";
. Суффикс не будет зависеть от локали. (Но я не думаю, что какой-либо здравомыслящий язык переставил бы строчные буквы; даже EBCDIC поддерживает их стандартный порядок.)Ответы:
Это только то, что
cat
было сделано для. Поскольку это один из самых старых инструментов GNU, я думаю, что маловероятно, что какой-либо другой инструмент сделает это быстрее / лучше. И это не трубопровод - это только перенаправление вывода.источник
cat x, then press Esc
Трюк вы упомянули аккуратный .. Я искал что - то подобное, спасибо ... хороший комментарий и хороший ответCtrl+W
чтобы вырезать слово, а затемCtrl+Y
вставить его.Под капотом
Нет более эффективного способа, чем копирование первого файла, затем копирование второго файла после него и так далее. Обе DOS
copy
и так иcat
делают.Каждый файл хранится независимо от других файлов на диске. Почти каждая файловая система, предназначенная для хранения данных на дисковом устройстве, работает блоками. Вот очень упрощенное представление о том, что происходит: диск разделен на блоки, скажем, 1 КБ, и для каждого файла операционная система хранит список блоков, из которых он состоит. Большинство файлов не имеют целое число длинных блоков, поэтому последний блок занят только частично. На практике файловые системы имеют много оптимизаций, таких как совместное использование последнего частичного блока между несколькими файлами или сохранение «блоков с 46798 по 47913» вместо «блока 46798, блока 46799,…». Когда операционной системе необходимо создать новый файл, она ищет свободные блоки. Блоки не должны быть последовательными: если только блоки 4, 5, 98 и 178 свободны, вы все равно можете сохранить файл 4 КБ.
Вы могли бы поддерживать частичные блоки в середине файла, но это добавило бы значительную сложность, особенно при доступе к файлам не последовательно: чтобы перейти к 10340-му байту, вы больше не могли перейти к 100-му байту 11-го блока. проверить длину каждого промежуточного блока.
Учитывая использование блоков, вы не можете просто соединить два файла, потому что обычно первый файл заканчивается в середине блока. Конечно, у вас может быть особый случай, но только если вы хотите удалить оба файла при объединении. Это будет очень специфическая обработка для редкой операции. Такая специальная обработка не существует сама по себе, потому что в типичной файловой системе доступ ко многим файлам осуществляется одновременно. Поэтому, если вы хотите добавить оптимизацию, вам нужно тщательно подумать: что произойдет, если какой-то другой процесс читает один из задействованных файлов? Что произойдет, если кто-то попытается объединить А и В, а кто-то соединит А и С? И так далее. В целом, эта редкая оптимизация была бы огромным бременем.
В общем, вы не можете сделать объединение файлов более эффективным, не делая больших жертв в другом месте. Это того не стоит.
На расщепление и присоединение
split
иcat
простые способы разделения и объединения файлов.split
заботится о создании файлов с именами в алфавитном порядке, так чтоcat *
работает для объединения.Недостатком
cat
объединения является то, что оно не устойчиво к обычным режимам отказа. Если один из файлов будет урезан или отсутствует,cat
вы не будете жаловаться, вы просто получите испорченный вывод.Существуют утилиты сжатия, которые создают многочастные архивы, такие как
zipsplit
иrar -v
. Они не очень удобны, потому что они сжимают и упаковывают (собирают несколько файлов в один) в дополнение к разбиению (и наоборот распаковывают и распаковывают в дополнение к объединению). Но они полезны тем, что они проверяют, что у вас есть все части, и что части завершены.источник
За исключением того, что на самом деле не то, что происходит. Оболочка подключает стандартный вывод
cat
напрямую к открытому файлу, что означает, что «проход через стандартный вывод» аналогичен записи на диск.источник
cat
. Спасибо, что сообщили мне о прямой связи.Однажды у меня возникла именно эта проблема: я хотел объединить некоторые файлы, но у меня не было достаточно места на диске для их двойного хранения.
Итак, я написал кучу программ:
Это позволило мне сделать что-то вроде
и, таким образом, удаляя исходный файл, пока 128M был еще не записан. Немного опасно, но если данные не так уж ценны или они существуют где-то еще, это выполнимо.
При необходимости могу предоставить источник.
источник
Технически говоря, это способ доступа ко всему файлу без необходимости читать и записывать все содержимое, и может быть полезен для больших файлов или если осталось мало места:
А потом использовать
myImage.iso
, напримерХотя, конечно
myImage.iso
, это специальный файл (именованный канал), а не обычный файл, так что это может быть полезно или нет в зависимости от того, что вы пытаетесь сделать.источник
Разделение файлов
Разделить по размеру
Если вы хотите разбить большой файл на маленькие файлы и выбрать имя и размер маленьких выходных файлов, это путь.
Таким образом, вы решили разделить один большой файл на более мелкие части по 500 МБ. Также вы хотите, чтобы имена файлов деталей были SmallFile. Обратите внимание, что вам нужно точка после имени файла. Результатом должно стать создание новых файлов, таких как:
Разделить по количеству линий
Таким образом, вы разбиваете текстовый файл на файлы меньшего размера, ограниченные 50 строками.
Результат должен быть примерно таким:
Разделить байтами
Разделить на небольшие файлы с произвольным размером небольших файлов в байтах:
Результат должен быть аналогичен результату разделения по количеству строк .
Присоединение файлов
Вы можете объединить файлы двумя способами. Первый из них:
или с:
Примечание. При объединении файлов небольшие файлы не должны быть повреждены. Также все маленькие (частично) файлы должны находиться в одном каталоге.
источник