Не будет большого выбора, кроме автоматизации описанных вами шагов, по причинам, продемонстрированным предостережениями в ответе Kimvais .
операции изменения tar
Команда tar
имеет несколько параметров для изменения существующих файлов tar.Однако они не подходят для вашего сценария по нескольким причинам, одна из которых заключается в том, что редактировать нужно не вложенный архив, а вложенный архив.Итак, вам придется проделать всю работу.
Допущения
Все ли архивы в главном архиве извлечены в текущий каталог или в именованный / созданный подкаталог?То есть, когда вы запускаете tar -tf master.tar.gz
, вы видите:
subdir-1.23/tarball1.tar
subdir-1.23/tarball2.tar
...
или вы видите:
tarball1.tar
tarball2.tar
(Обратите внимание, что вложенные тары не должны быть сжаты сами по себе, если онибыть встроенным в сжатый архив большего размера.)
master_repackager
Если у вас есть обозначение подкаталога, то вы можете сделать:
for master in "$@"
do
tmp=$(pwd)/xyz.$$
trap "rm -fr $tmp; exit 1" 0 1 2 3 13 15
cat $master |
(
mkdir $tmp
cd $tmp
tar -xf -
cd * # There is only one directory in the newly created one!
process_tarballs *
cd ..
tar -czf - * # There is only one directory down here
) > new.$master
rm -fr $tmp
trap 0
done
Если вы работаете ввредоносная среда, используйте имя каталога, отличное от tmp.$$
.Однако такого рода переупаковка обычно не выполняется во вредоносной среде, и выбранное имя, основанное на идентификаторе процесса, достаточно, чтобы дать всем уникальное имя.Использование tar -f -
для ввода и вывода позволяет переключать каталоги, но по-прежнему обрабатывать относительные пути в командной строке.Вероятно, есть другие способы справиться с этим, если хотите.Я также использовал cat
, чтобы подать входные данные в подоболочку, чтобы поток сверху вниз был чистым;технически, я мог бы улучшить положение вещей, используя ) > new.$master < $master
в конце, но это скрывает некоторую важную информацию несколькими строками позже.
Команды ловушки гарантируют, что (a) если сценарий прерван (сигнализирует HUP, INT, QUIT, PIPE или TERM), временный каталог удаляется, и состояние выхода равно 1 (не успешно) и (b) после удаления подкаталога процесс может завершиться с нулевым статусом.
Вы можетенужно проверить, существует ли новый. $ master, прежде чем его перезаписать.Возможно, вам придется проверить, что операция извлечения действительно извлекла вещи.Возможно, вам придется проверить, действительно ли работает подархивирование.Если главный архив извлекается в несколько подкаталогов, вам необходимо преобразовать строку 'cd *
' в некоторый цикл, который перебирает создаваемые им подкаталоги.
Все эти проблемы можно пропустить, если вы знаетедостаточно о содержимом и ничего не идет не так.
process_tarballs
Второй сценарий - process_tarballs;он обрабатывает каждый из tar-архивов в своей командной строке по очереди, извлекает файл, производит замены, переупаковывает результат и т. д. Одно из преимуществ использования двух сценариев заключается в том, что вы можете тестировать обработку tarball отдельно от более сложной задачи, связанной старбол, содержащий несколько тарболов.Опять же, жизнь будет намного проще, если каждый из подархивов извлечет в свой собственный подкаталог;если какой-либо из них будет извлечен в текущий каталог, убедитесь, что вы создали для него новый подкаталог.
for tarball in "$@"
do
# Extract $tarball into sub-directory
tar -xf $tarball
# Locate appropriate sub-directory.
(
cd $subdirectory
find . -type f -print0 | xargs -0 sed -i 's/name/alternative-name/g'
)
mv $tarball old.$tarball
tar -cf $tarball $subdirectory
rm -f old.$tarball
done
Вы также должны добавить ловушки для очистки здесь, чтобы скрипт мог запускаться изолированноиз мастер сценария выше и до сих пор не оставляйте никаких промежуточных каталогов вокруг.В контексте внешнего скрипта вам может не потребоваться быть настолько осторожным, чтобы сохранить старый архив данных до того, как будет создан новый (так что rm -f $tarbal
вместо команды перемещения и удаления), но обработанный сам по себе, скрипт долженбудьте осторожны, чтобы не повредить что-либо.
Резюме
- То, что вы пытаетесь, не тривиально.
- Отладка разбивает работу на два сценария, которые можно протестировать независимо.
- Обрабатывать угловые дела намного проще, когда вы знаете, что на самом деле находится в файлах.