LINUX.ORG.RU

Просто распаковать «простое»

 , , ,


1

2

Небольшая головоломка. Всегда можно просто за-cat-ить какую-либо папку:

$ cat * > ../test.cat
$ ls -al * > ../test.ls

Получается такая простенькая «упаковка» (примитивный tar). А как это дело распаковать? Чтоб без геморроя?

Deleted

Да никак. Ты же понимаешь, что ты тупо положил вывод этих команд в текстовые файлы. Теперь обрабатывай текстовые файлы. Мы же не знаем, что у тебя там за содержимое, поэтому парсить это тебе самому. Тебе нужно было использовать tar, а не маяться вот этим вот. Тем более, сжатие использовать совсем-совсем не обязательно, и это будет ничуть не медленнее, чем сделал ты, но только вот несколько проще и правильнее.

Deleted
()
Ответ на: комментарий от Deleted

Мы же не знаем, что у тебя там за содержимое

Здрасте-мордасти. test.ls - описание содержимого. test.cat - само содержимое.

несколько проще и правильнее.

Смотря как посмотреть и для каких целей.

Deleted
()
Ответ на: комментарий от Deleted

Ну ты совсем не понимаешь, чтоли? Как из того, что ты себе там «заархивировал» определить, какое содержимое к какому файлу относится? По заголовкам ZIP от txt отличать? А если это DOCX vs XML vs ZIP? Ты сам вот подумай, прежде чем бредить и пытаться изобретать велосипед. Нет, твой подход не верен. Хотя можешь, конечно, пропарсить вывод *.lst, взять имя файла из вывода, размер, откусить кусок файла, сохранить и т.п. Ну в общем cat, grep, cut, awk/sed тебе в помощь, да. Пиши теперь скрипт и пердолься.

Deleted
()
Ответ на: комментарий от Deleted

какое содержимое к какому файлу относится?

В test.ls содержится и имя, и длина, и даже атрибуты.

Deleted
()
Ответ на: комментарий от Deleted

Да, сорян, не заметил сразу, а потом не успел удалить коммент до твоего ответа.

Ну смотри, можно распарсить test.ls и вытащить твои файлы обратно. Но: общепризнано, что парсить выхлоп ls - плохая практика, он слишком изменчивый, особенно если есть странные имена файлов. В остальном - да, ты придумал нестандартный аналог tar.

legolegs ★★★★★
()
Ответ на: комментарий от Deleted

Ну. А теперь сообрази, как работает tar. Точно так же, только всё пишется в один файл: сначала атрибуты и метаданные, потом содержимое файла, потом со следующим так же и т.п. Ты тут вот хочешь странного. Ну бери, парси вывод ls относительно каждого файла и вырезай его часть из «архива».

Deleted
()
Ответ на: комментарий от sin_a

Кстати, а вот это можно будет несколько более простым методом разархивировать, если атрибуты тебе не нужны.

Deleted
()
Ответ на: комментарий от Deleted

А то, что порядок в test.ls может не совпадать с порядком «архивации».

К чорту подробности.

Deleted
()
Ответ на: комментарий от Deleted

man grep, man cut, man awk, man head, man tail, man sed. Я не знаю, что именно из этого ты будешь использовать, но делать за тебя мне честно лень. Без пердолинга никак, а судя по этому треду, ты хочешь попердолиться, только не в силах это признать.

Deleted
()

идея аналогична самораспаковывающимся шелл-скриптам: https://www.linuxjournal.com/node/1005818

тебе надо получить offset и размер очередного файла. потом tail -n+size и готово. и, да, ты можешь всё слить в один файл: распаковщик, test.ls и test.cat[.gz]

aol ★★★★★
()
Ответ на: комментарий от Deleted

как вообще работают с текстовыми файлами в bash?

Да согласен. Просто слегка недоволен.

Deleted
()
Ответ на: комментарий от aol

https://www.linuxjournal.com/node/1005818

The parameter

-n+$ARCHIVE
tells tail to start at line number we just read in the previous command, and print til the end of the file.

Не то. Не надо нам никаких строк.

Deleted
()
Ответ на: комментарий от Deleted

а ты ожидал, я тебе готовое решение принесу? :) нет, этого не произойдет.

пример с самораспаковывающимся скриптом достаточно красноречиво описывает проблему, которую ты себе поставил и собираешься решить. изучи его и вперед, к новым свершениям!

aol ★★★★★
()

Ну так читай в цикле test.ls, получай имя файла и размер, читай нужный кусок с помощью dd или tail и все. Делов то.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

читай нужный кусок с помощью dd

С помощью dd напомни:

$ dd if=test.cat of=${tfile} bs=1 skip=${presize} count=${size}
$ file ${tfile}

Так?

Deleted
()

Ну какой-то такой распаковщик может быть:

exec < ../test.cat
exec {ls}< ../test.ls

while read -r -u $ls perms hardlinks user group size month day time filename; do
  head -c "$size" > "$filename"
  #chown "$user:$group" "$filename" #требует рута
  #TODO: perms mdate
done

Но он, разумеется, сломается на файлах с именами типа

вот
такое
имя
legolegs ★★★★★
()
Ответ на: комментарий от Deleted

Совершенно верно.

$ cat a
1234567890
$ dd if=a bs=1 skip=3 count=2 status=none
45%                                                                                                                                                                       $ 

urxvt ★★★★★
()

Я после поста автора полез экспериментировать, и обнаружил что vim умеет напрямую с tar работать :D

voltmod ★★
()

Упаковщик Попова.

Попов, перелогинься.

anonymous
()

Небольшая головоломка

простое

∞!=...

anonymous
()

По-моему практичнее сделать что-то вроде multipart/form-data, чтобы сложно не считать смещения. Это сложнее, чем просто выхлоп ls и cat, но проще, чем tar в плане реализации запаковки из подручных средств

WDWTFWW
()
Ответ на: комментарий от WDWTFWW

практичнее сделать что-то вроде multipart/form-data

Насколько я понял, multipart/form-data более похож на tar и представляет собой последовательность head+data. У этого есть плюсы: можно как и в tar лепить «упаковку» из файлов «кирпичиками». Но есть и минус (как и у tar): нет единого описания (test.ls).

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.