LINUX.ORG.RU

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

 , , ,


2

3

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

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

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

Deleted

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

aol ★★★★★ ()

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

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 ★★★★★ ()

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

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

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

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

Deleted ()