URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 37496
[ Назад ]

Исходное сообщение
"Чем объединить два файла из командной строки?"

Отправлено zx , 20-Ноя-03 10:20 
Как объединить два файла в FreeBSD?
Имеем:
# ls -l
total 3146784
-rw-rw-r--  1 root  wheel  3221438976 20 ноя 12:29 f2
-rw-rw-r--  1 root  wheel       32256 11 фев  2003 f1

Надо f1 + f2 = f3. Причем чтобы содержимое f1 оказалось в начале файла f3.

Какой командой это делается?

Можно конечно cat f2.d >>f1.d, но это как-то долго, в f2 все таки как никак 3 гига будет. Да и месте на диске нет для второго 3-х гигового файла.


Содержание

Сообщения в этом обсуждении
"Чем объединить два файла из командной строки?"
Отправлено tstalker , 20-Ноя-03 11:16 
>Можно конечно cat f2.d >>f1.d, но это как-то долго

Сам же и ответил на свой вопрос. Это стандартный прием конкатенации файлов.
А что долго - так не думаю, что под форточками будет быстрее...

> Да и месте на диске нет для второго 3-х гигового файла.

Однозначно будет создан результирующий файл с размером f1+f2.
И соответственное дисковое пространство под него потребуется.
Такова се ля ви... :)


"Чем объединить два файла из командной строки?"
Отправлено zx , 20-Ноя-03 11:46 
>>Можно конечно cat f2.d >>f1.d, но это как-то долго
>
>Сам же и ответил на свой вопрос. Это стандартный прием конкатенации файлов.
>
>А что долго - так не думаю, что под форточками будет быстрее...
>
>
>> Да и месте на диске нет для второго 3-х гигового файла.
>
>Однозначно будет создан результирующий файл с размером f1+f2.
>И соответственное дисковое пространство под него потребуется.
>Такова се ля ви... :)

Жопа блин какая-то получается. Придется значит винт дополнительный искать. :( Не ужели нет способа выкрутится в моем случае?


"Чем объединить два файла из командной строки?"
Отправлено lavr , 20-Ноя-03 12:09 
>Как объединить два файла в FreeBSD?
>Имеем:
># ls -l
>total 3146784
>-rw-rw-r--  1 root  wheel  3221438976 20 ноя 12:29 f2
>
>-rw-rw-r--  1 root  wheel      
>32256 11 фев  2003 f1
>
>Надо f1 + f2 = f3. Причем чтобы содержимое f1 оказалось в
>начале файла f3.
>
>Какой командой это делается?
>
>Можно конечно cat f2.d >>f1.d, но это как-то долго, в f2 все таки как никак 3 гига будет. Да и месте на диске нет для второго 3-х гигового файла.

программка на си или perl - открывает большой файл f2 и дописывает
в начало f1, по заверщении удаляет f1 и переименовывает (если нужно f2)

ну детское задание.


"Чем объединить два файла из командной строки?"
Отправлено lavr , 20-Ноя-03 12:10 
>>Как объединить два файла в FreeBSD?
>>Имеем:
>># ls -l
>>total 3146784
>>-rw-rw-r--  1 root  wheel  3221438976 20 ноя 12:29 f2
>>
>>-rw-rw-r--  1 root  wheel      
>>32256 11 фев  2003 f1
>>
>>Надо f1 + f2 = f3. Причем чтобы содержимое f1 оказалось в
>>начале файла f3.
>>
>>Какой командой это делается?
>>
>>Можно конечно cat f2.d >>f1.d, но это как-то долго, в f2 все таки как никак 3 гига будет. Да и месте на диске нет для второго 3-х гигового файла.
>
>программка на си или perl - открывает большой файл f2 и дописывает
>
>в начало f1, по заверщении удаляет f1 и переименовывает (если нужно f2)
>
>
>ну детское задание.

прим: судя по размеру f1 - его вообще сразу можно в память прочитать и
удалить, потом дописать в начало f2.


"Чем объединить два файла из командной строки?"
Отправлено zx , 20-Ноя-03 12:21 
>>>Как объединить два файла в FreeBSD?
>>>Имеем:
>>># ls -l
>>>total 3146784
>>>-rw-rw-r--  1 root  wheel  3221438976 20 ноя 12:29 f2
>>>
>>>-rw-rw-r--  1 root  wheel      
>>>32256 11 фев  2003 f1
>>>
>>>Надо f1 + f2 = f3. Причем чтобы содержимое f1 оказалось в
>>>начале файла f3.
>>>
>>>Какой командой это делается?
>>>
>>>Можно конечно cat f2.d >>f1.d, но это как-то долго, в f2 все таки как никак 3 гига будет. Да и месте на диске нет для второго 3-х гигового файла.
>>
>>программка на си или perl - открывает большой файл f2 и дописывает
>>
>>в начало f1, по заверщении удаляет f1 и переименовывает (если нужно f2)
>>
>>
>>ну детское задание.
>
>прим: судя по размеру f1 - его вообще сразу можно в память
>прочитать и
>удалить, потом дописать в начало f2.

Если не секрет, то чем дописывают в начало файла?


"Чем объединить два файла из командной строки?"
Отправлено lavr , 20-Ноя-03 12:43 
>>>>Как объединить два файла в FreeBSD?
>>>>Имеем:
>>>># ls -l
>>>>total 3146784
>>>>-rw-rw-r--  1 root  wheel  3221438976 20 ноя 12:29 f2
>>>>
>>>>-rw-rw-r--  1 root  wheel      
>>>>32256 11 фев  2003 f1
>>>>
>>>>Надо f1 + f2 = f3. Причем чтобы содержимое f1 оказалось в
>>>>начале файла f3.
>>>>
>>>>Какой командой это делается?
>>>>
>>>>Можно конечно cat f2.d >>f1.d, но это как-то долго, в f2 все таки как никак 3 гига будет. Да и месте на диске нет для второго 3-х гигового файла.
>>>
>>>программка на си или perl - открывает большой файл f2 и дописывает
>>>
>>>в начало f1, по заверщении удаляет f1 и переименовывает (если нужно f2)
>>>
>>>
>>>ну детское задание.
>>
>>прим: судя по размеру f1 - его вообще сразу можно в память
>>прочитать и
>>удалить, потом дописать в начало f2.
>
>Если не секрет, то чем дописывают в начало файла?

man open/close read/write seek/lseek printf/putc (CC)


"Чем объединить два файла из командной строки?"
Отправлено zx , 20-Ноя-03 12:47 
>>>>>Как объединить два файла в FreeBSD?
>>>>>Имеем:
>>>>># ls -l
>>>>>total 3146784
>>>>>-rw-rw-r--  1 root  wheel  3221438976 20 ноя 12:29 f2
>>>>>
>>>>>-rw-rw-r--  1 root  wheel      
>>>>>32256 11 фев  2003 f1
>>>>>
>>>>>Надо f1 + f2 = f3. Причем чтобы содержимое f1 оказалось в
>>>>>начале файла f3.
>>>>>
>>>>>Какой командой это делается?
>>>>>
>>>>>Можно конечно cat f2.d >>f1.d, но это как-то долго, в f2 все таки как никак 3 гига будет. Да и месте на диске нет для второго 3-х гигового файла.
>>>>
>>>>программка на си или perl - открывает большой файл f2 и дописывает
>>>>
>>>>в начало f1, по заверщении удаляет f1 и переименовывает (если нужно f2)
>>>>
>>>>
>>>>ну детское задание.
>>>
>>>прим: судя по размеру f1 - его вообще сразу можно в память
>>>прочитать и
>>>удалить, потом дописать в начало f2.
>>
>>Если не секрет, то чем дописывают в начало файла?
>
>man open/close read/write seek/lseek printf/putc (CC)

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


"Чем объединить два файла из командной строки?"
Отправлено Antonio , 20-Ноя-03 13:51 
>>Если не секрет, то чем дописывают в начало файла?
>
>man open/close read/write seek/lseek printf/putc (CC)

Тупо и в лоб (ведь write и fwrite не умеют требуемый нам "insert mode", а занимать много дополнительного места на диске по условию нельзя):

От конца большого файла к началу бежит "окошко" размером с маленький файл, которое переписывает данные "из себя" за свою правую границу. При первом применении оно пишет за правый край файла, увеличив его на размер маленького. Таким образом, дойдя до начала файла, мы "освободим" в начале нужное число байт. И впишем туда содержимое маленького.

Скорость алгоритма безобразно медленная (ведь фактически имеем произвольный доступ).

Давно не брал я в руки компилятор... Может, можно изящнее?


"Чем объединить два файла из командной строки?"
Отправлено qq , 20-Ноя-03 15:21 
>Как объединить два файла в FreeBSD?
>Имеем:
># ls -l
>total 3146784
>-rw-rw-r--  1 root  wheel  3221438976 20 ноя 12:29 f2
>
>-rw-rw-r--  1 root  wheel      
>32256 11 фев  2003 f1
>
>Надо f1 + f2 = f3. Причем чтобы содержимое f1 оказалось в
>начале файла f3.
>
>Какой командой это делается?
>
>Можно конечно cat f2.d >>f1.d, но это как-то долго, в f2 все таки как никак 3 гига будет. Да и месте на диске нет для второго 3-х гигового файла.

а может можно обойтись без слияния файлов?
например использовать
cat f1 f2|some_comand
или netcat с опцией -e и получить данные через сокет?