Приведенное выше предложение с использованием grep -F --byte-offset ...
и dd
не работает для меня в macOS High Sierra, так как /usr/bin/grep
выводит неправильное смещение - я думаю, что это смещение "строки", которая содержит слово ftypmp4
, т.е. позиция предыдущего символа LF плюс один. Я могу ошибаться, но в любом случае, это мое решение:
for i in MVIMG*.jpg; do \
perl -0777 -ne 's/^.*(....ftypmp4.*)$/$1/s && print' "$i" >"${i%.jpg}.mp4"; \
done
При этом используется perl
возможность одновременно обрабатывать целый файл и рассматривать его как одну большую строку. Если нет ftypmp4
с хотя бы четырьмя старшими байтами, создается пустой файл, если присутствует несколько, извлекается последний.
Аналогично, чтобы удалить видео из всех файлов:
for i in MVIMG*.jpg; do \
perl -0777 -pi -e 's/^(.*?)....ftypmp4.*$/$1/s' "$i"; \
done
Используется функция редактирования на месте perl
. Все после первого появления ftypmp4
с четырьмя старшими байтами обрезается. Если вхождений нет, файл перезаписывается с неизменным содержимым.
(Можно или не нужно устанавливать PERLIO = raw в среде и / или сбрасывать переменные, связанные с локалью, чтобы избежать интерпретации UTF-8, что может не сработать для двоичных файлов, которые содержат последовательности байтов, которые нарушают UTF- 8. Правила составления. В моих тестах с различными файлами MVIMG таких проблем не возникало.)