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

Afaik находят, имеет все, в чем Вы нуждаетесь.

find . -okdir diff {} /some/other/path/{} ";"

найдите берет себя, забота о вызове программ savely.-okdir предложит Вам перед разностью (Вы уверенный да/нет).

Никакая включенная оболочка, никакой globbing, шутники, пи, pa, почтовый.

Как заметка на полях: Если Вы объединяетесь, находят с for/while/do/xargs, в большинстве случаев, Вы делаете его неправильно.:)

75
16.11.2011, 01:54
6 ответов

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

52
27.01.2020, 19:31
  • 1
    cat x, then press Esc обманите Вас упомянутый, аккуратно.. Я искал что-то как этот, спасибо... хороший комментарий и хороший ответ –  Peter.O 15.11.2011, 14:46
  • 2
    Пожалуйста :) Кроме того, когда у Вас есть тот список файлов на командной строке, можно использовать Ctrl+W отключать слово и затем Ctrl+Y вставлять его. –  rozcietrzewiacz 15.11.2011, 14:50
  • 3
    этих 2,4 дней, "конкатенируют" –  JoelFan 15.11.2011, 18:12
  • 4
    .. и "соединитесь", получает из латинского слова "цепь", что означает "цепочку".. конкатенация соединяет ссылки цепочки.... (и немного далее вне темы, цепная кривая также происходит из "цепи". Это - способ, которым цепочка зависает) –  Peter.O 15.11.2011, 19:03

Под капотом

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

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

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

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

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

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

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

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

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

19
27.01.2020, 19:31

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

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

8
27.01.2020, 19:31
  • 1
    я просто предполагал использовать кошку для отображения нескольких гигабайтов кода в консоли, затем получая и помещая его в файл. Это - умственное изображение, которое я имею для того, что должно происходить, когда я использую кошку и перенаправляю вывод, который я не вижу. Просто походило, если бы был способ, которым Вы могли бы открыть два файла, соединить их и затем закрыть их, то это было бы более эффективно, чем пробежка всех строк кода с cat. Спасибо за то, что сообщили мне о прямом подключении. –  cwd 15.11.2011, 16:16
  • 2
    @cwd, будет возможно разработать файловую систему, где Вы могли присоединиться к двум файлам тот путь, но это усложнит дизайн файловой системы очень. Вы оптимизировали бы для той одной операции за счет создания большого количества общих задач, более сложных и медленнее. –  Gilles 'SO- stop being evil' 16.11.2011, 01:29
  • 3
    @Gilles - было бы интересно знать больше о низкоуровневых деталях. Мне, читая все секторы от жесткого диска для нескольких файлов и затем выводя их назад в другие неиспользованные секторы на диске кажется неэффективным. И я думаю, что большие файлы должны время от времени храниться через несколько блоков свободных секторов, потому что не может всегда быть достаточного количества блоков рядом для хранения их. Поэтому теоретически Вы могли присоединиться к файлам в один путем удаления маркера EOF и указывающий на группу секторов в начале следующего файла. *отклоните, мощно, таким образом, я задался вопросом, был ли лучший путь, чем кошка. –  cwd 16.11.2011, 01:53
  • 4
    @cwd Там является не “маркером EOF”. Никакая нормальная современная файловая система не работает как этот, потому что это препятствует тому, чтобы некоторые символы произошли в файлах (или иначе требует сложной кодировки). Но даже если бы был маркер EOF, большую часть времени, то у Вас не было бы правильного файла после него. –  Gilles 'SO- stop being evil' 16.11.2011, 01:59
  • 5
    я имел в виду понятие маркера EOF и не фактического маркера EOF. Иначе, если Вы смотрите на биты и байты файла на жестком диске, как Вы знаете, где он заканчивается? Вы указываете длину файла в начале его? Я говорю о действительно низкоуровневой вещи. Это то, к чему Вы также обращаетесь? –  cwd 16.11.2011, 02:04

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

Таким образом, я записал набор программ:

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

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

partto sourcefile | mybuffer 128M >>cumufile

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

В случае необходимости я могу обеспечить источник.

3
27.01.2020, 19:31

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

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

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

$ md5sum myImage.iso

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

0
27.01.2020, 19:31

Разделение файлов

Разделить по размеру

Если вы хотите разбить большой файл на маленькие файлы и выбрать имя и размер маленьких выходных файлов, это способ.

split -b 500M videos\BigVideoFile.avi SmallFile.

Таким образом вы выбираете разделение одного большого файла на более мелкие части по 500 МБ. Также вы хотите, чтобы имена файлов деталей были SmallFile. Обратите внимание, что вам нужна точка после имени файла. Результатом должно быть создание новых файлов, подобных этому:

SmallFile.ab SmallFile.ad SmallFile.af SmallFile.ah SmallFile.aj
SmallFile.aa SmallFile.ac SmallFile.ae SmallFile.ag SmallFile.ai SmallFile.ak
...

Разделить по количеству строк

Таким образом вы разделите текстовый файл на файлы меньшего размера, ограниченные 50 строками.

split -l 50 text_to_split.txt

Результат должен быть примерно таким:

xaa xab xac...

Разделить по байтам

Разделить на небольшие файлы с произвольным размером небольших файлов в байтах:

split -b 2048 BigFile.mp4

Результат должен быть аналогичен результату Разбиение по количеству строк .

Объединение файлов

Вы можете объединить файлы двумя способами. Первый из них:

cat SmallFile.* > OutputBigVideoFile.avi

или с:

cat SmallFile.?? > OutputBigVideoFile.avi

Примечание.:При объединении файлов маленькие файлы не должны быть повреждены. Также все небольшие файлы (части )должны находиться в одном каталоге.

2
27.01.2020, 19:31

Теги

Похожие вопросы