Intereting Posts

Создать версию с помощью tar

У меня есть проект с обычным материалом (исходный код, yadda, yadda), и я хочу иметь команду для Scons (но это может быть любая система сборки, если честно), которая будет делать следующее:

  1. Постройте систему – это легко.
  2. Создайте мишень из системы – это легко.
  3. Когда содержимое шарика tar извлекается, они извлекаются в fubar-VERSION/ – это сложная часть.

Я могу сделать последнее вручную, создав символическую ссылку, а затем tar из одного каталога над проектом, но это не так просто. Есть идеи?

Чтобы уточнить, я хочу иметь возможность сделать это:

 ; pwd ~/project ; scons release [...] ; cp project-XYZtbz /tmp ; cd /tmp ; tar jxvf project-XYZtbz ./project-XYZ/[...] 

Таким образом, архивы извлекаются в каталог, названный в честь проекта, с правильным номером версии.

С GNU tar:

 tar cjf ../fubar-4.2.tar.bz2 --transform='s/^\./fubar-4.2/' --exclude='*.o' . 

Традиционные реализации tar не имеют никакого отношения к этому. Даже у FreeBSD tar нет аналогичной функции, о которой я знаю.

С pax замена POSIX для cpio и tar:

 pax -w -s '/^\./fubar-4.2/' -s '/\.o$//' . | bzip2 >../fubar-4.2.tar.bz2 

Хотя pax является обязательным в текущих стандартах POSIX / Single Unix, многие дистрибутивы Linux не устанавливают его по умолчанию. Если вы поддерживаете GNU tar и pax, вы будете охватывать почти все не внедренные системы.

По крайней мере, bsdtar 2.8.4 и выше имеет параметр -s pattern для изменения имен файлов или архивов в соответствии с данным базовым шаблоном регулярного выражения.

 # using '^\.' as pattern bsdtar -czvf test.tar.gz . bsdtar -tzvf test.tar.gz bsdtar -s '|^\.|archive-XYZ|' -xzvf test.tar.gz # using '^[^/]*' as pattern bsdtar -C .. -czvf test.tar.gz "$(basename "$(pwd -P)")" bsdtar -tzvf test.tar.gz bsdtar -s '|^[^/]*|archive-XYZ|' -xzvf test.tar.gz