практическое руководство оболочки: сохраните несколько файлов двоичных данных (jpg) в один файл с некоторыми дополнительными данными и отдельный снова

dd инициированный уничтожитель OOM, который, в свою очередь, уничтожил процесс с самым высоким счетом OOM.

3
31.12.2011, 00:37
2 ответа

Вы в значительной степени пытаетесь переосмыслить tar или подобные форматы архивации; не ожидайте делать вещи вручную для EA, чем использование существующих инструментов.

Если Вы настаиваете на пользовательской границе (который опасен, поскольку эта граница могла появиться естественно в одном из jpeg файлов), заставьте его запуститься и закончитесь новой строкой. Это упростит обработку с awk.

Я рекомендую разделить каждый файл, но ограничить количество файлов на каталог к достаточно маленькому количеству, которое не вызывает хит производительности. С одним файлом каждые 5 секунд, вложенная структура дня/часа/минуты дает максимальное ветвление 366/60/20, который должен быть в порядке мудр производительностью.

Если Вы хотите использовать архивы, и, учитывая отсутствие r команда в tar Busybox, Вы могли хранить файлы N в файловой системе, затем периодически сделать архив с существующими файлами и убрать большой список. Например, для создания архива каждыми 100 файлами:

set -- *
if [ $# -gt 100 ]; then
  set ../archives/*.tar
  eval "last=\${$#}"
  last=${last%[!0-9]}; last=${last##[!0-9]}
  tar cf ../archives/$((last+1)).tar -- *
  rm -- *
fi
1
27.01.2020, 21:24

Если можно запустить, просто используйте tar. Это имеет, "добавляют режим" с r опция:

$ ls t.tar
ls: cannot access t.tar: No such file or directory
$ tar rvf t.tar t.c
t.c
$ tar rvf t.tar t.cpp
t.cpp
$ tar tf t.tar
t.c
t.cpp

(Как Вы видите, файл tar не должен существовать для использования добавлять режима, таким образом, это должно быть действительно просто в использовании для случая.)

Если у Вас нет роскоши полной реализации tar GNU, awk должен смочь уладить Ваш объединенный файл с чем-то как (взятый из этого сообщения Переполнения стека):

awk -vRS="--myboundary" '{ print $0 > NR".jpg" }' yourfile

Это создаст названные файлы 1.jpg, 2.jpg, и т.д. проблема: это добавляет случайное \n в конце файла.
Принятие Вас имеет truncate и stat в Вашей среде можно согласовать те файлы с:

truncate -s $(( $(stat -c %s 1.jpg) - 1 )) 1.jpg

Если Вы не имеете stat, Вам будет нужно что-то еще для выяснения имени файла (анализирующий вывод ls мог бы быть в порядке при этом обстоятельстве, так как Вы знаете, что имена файлов нормальны). Если Вы не имеете truncate, можно добиться цели с dd, или возможно с head или tail.
Или можно проигнорировать запаздывание \n, возможности хороши, изображения отобразятся правильно независимо.

Демонстрация:

$ cp orig.1.png blob
$ echo -n "HELLOHELLO" >> blob 
$ cat orig.2.png >> blob 
$ ls -l
total 36
-rw-r--r-- 1 test test 14916 Dec 30 19:42 blob
-rw-r--r-- 1 test test  5735 Dec 30 19:41 orig.1.png
-rw-r--r-- 1 test test  9171 Dec 30 19:41 orig.2.png

$ awk -vRS="HELLOHELLO" '{print $0 > "new."NR".png"}' blob
$ ls -l
total 56
-rw-r--r-- 1 test test 14916 Dec 30 19:42 blob
-rw-r--r-- 1 test test  5736 Dec 30 19:43 new.1.png
-rw-r--r-- 1 test test  9172 Dec 30 19:43 new.2.png
-rw-r--r-- 1 test test  5735 Dec 30 19:41 orig.1.png
-rw-r--r-- 1 test test  9171 Dec 30 19:41 orig.2.png

$ for i in new* ; do truncate -s $(( $(stat -c %s $i) - 1 )) $i ; done
$ ls -l
total 56
-rw-r--r-- 1 test test 14916 Dec 30 19:42 blob
-rw-r--r-- 1 test test  5735 Dec 30 19:43 new.1.png
-rw-r--r-- 1 test test  9171 Dec 30 19:43 new.2.png
-rw-r--r-- 1 test test  5735 Dec 30 19:41 orig.1.png
-rw-r--r-- 1 test test  9171 Dec 30 19:41 orig.2.png
$ md5sum *.png
70718d7b9e717206b4a8455ea32b51ed  new.1.png
531099b9527f5fc2b623a3f724573ea9  new.2.png
70718d7b9e717206b4a8455ea32b51ed  orig.1.png
531099b9527f5fc2b623a3f724573ea9  orig.2.png
2
27.01.2020, 21:24
  • 1
    Спасибо за быстрый ответ Mat. К сожалению, busybox версия tar не поддерживает "-r" опцию. Это - интересная идея использовать архив непосредственно. Вы знаете какой-либо метод того, как извлечь другой jpg's из одного составного файла, как упомянуто в вопросе? –  user13816 30.12.2011, 20:07
  • 2
    Могли Вы пробовать awk изменение я просто отредактировал в? –  Mat 30.12.2011, 20:29
  • 3
    я попробовал его, спасибо. Это, кажется, работает. Изображения могут быть просмотрены (глаз гнома). Разве Вы не думаете, что я могу обойти проблему с запаздыванием/n установкой ORS = ""? –  user13816 30.12.2011, 21:31
  • 4
    хорошо, большое спасибо Mat. Это добилось цели. ORS = "" также удаляет новую строку, таким образом, извлеченные изображения идентичны исходным. –  user13816 31.12.2011, 00:24

Теги

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