Afaik находят, имеет все, в чем Вы нуждаетесь.
find . -okdir diff {} /some/other/path/{} ";"
найдите берет себя, забота о вызове программ savely.-okdir предложит Вам перед разностью (Вы уверенный да/нет).
Никакая включенная оболочка, никакой globbing, шутники, пи, pa, почтовый.
Как заметка на полях: Если Вы объединяетесь, находят с for/while/do/xargs, в большинстве случаев, Вы делаете его неправильно.:)
Это что cat
был сделан для. Так как это - один из самых старых инструментов GNU, я думаю, что очень маловероятно, что любой другой инструмент делает это быстрее/лучше. И это не передает по каналу - это только перенаправляет вывод.
Нет никакого более эффективного пути, чем копирование первого файла, затем копирование второго файла после него, и так далее. Оба 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, потому что они сжимают и упаковывают (соберите несколько файлов в один) в дополнение к разделению (и с другой стороны распаковывают и распаковывают в дополнение к присоединению). Но они полезны в этом, они проверяют, что у Вас есть все части, и что части завершены.
Кажется, что должен быть более эффективный путь, чем передача по каналу всего содержания через систему
stdin
/stdout
Кроме это не действительно, что происходит. Оболочка соединяет stdout cat
непосредственно в открытый файл, что означает, что "прохождение через stdout" совпадает с записью в диск.
cat
. Спасибо за то, что сообщили мне о прямом подключении.
– cwd
15.11.2011, 16:16
У меня когда-то была точно эта проблема: Я хотел присоединиться к некоторым файлам, но имел недостаточно дискового пространства для содержания их вдвойне.
Таким образом, я записал набор программ:
Это позволило мне сделать что-то как
partto sourcefile | mybuffer 128M >>cumufile
и таким образом удаляя исходный файл, в то время как 128M было все еще не записано. Немного опасный, но если данные не настолько драгоценны, или они существуют где-то в другом месте также, это выполнимо.
В случае необходимости я могу обеспечить источник.
Технически говоря , это способ доступа ко всему файлу без необходимости чтения и записи всего содержимого, и он может быть полезен для огромных файлов или если осталось мало места:
$ mkfifo myImage.iso
$ cat xa{a..g} > myImage.iso &
А затем используйте myImage.iso
, например
$ md5sum myImage.iso
Хотя, конечно, myImage.iso
- это специальный файл (именованный канал), а не обычный файл, поэтому он может быть полезен или нет, в зависимости от того, что вы пытаетесь сделать.
Разделение файлов
Разделить по размеру
Если вы хотите разбить большой файл на маленькие файлы и выбрать имя и размер маленьких выходных файлов, это способ.
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
Примечание.:При объединении файлов маленькие файлы не должны быть повреждены. Также все небольшие файлы (части )должны находиться в одном каталоге.
cat x, then press Esc
обманите Вас упомянутый, аккуратно.. Я искал что-то как этот, спасибо... хороший комментарий и хороший ответ – Peter.O 15.11.2011, 14:46Ctrl+W
отключать слово и затемCtrl+Y
вставлять его. – rozcietrzewiacz 15.11.2011, 14:50