เปลี่ยนชื่อไดเรกทอรีภายในไฟล์เก็บถาวร tar


14

เป็นไปได้ไหมที่จะเปลี่ยนชื่อไดเรกทอรีภายในไฟล์เก็บถาวร tar? กรณีการใช้งานของฉันคือฉันมีไฟล์ข้อมูลจำเพาะ RPM ภายนอกที่สมมติว่า tarball ที่มีโครงสร้างไดเรกทอรีที่แน่นอนและฉันมี tarball ที่จัดไว้ภายนอกซึ่งมีชื่อไดเรกทอรีระดับบนสุดไม่ตรงกับสิ่งที่ไฟล์ spec คาดหวัง ฉันไม่ได้ควบคุมสคริปต์ที่สร้าง tarballs หรือไฟล์ spec RPM ดังนั้นฉันจึงไม่สามารถเปลี่ยนแปลงหนึ่งในนั้นเพื่อให้ตรงกับที่อื่น

สิ่งที่ฉันได้ทำคือไม่ต้องมีการเปลี่ยนชื่อไดเรกทอรีจากนั้นสร้าง tarball ใหม่ แต่ฉันสงสัยว่ามีทางเลือกอื่นในการทำเช่นนั้นหรือไม่


3
น่าเสียดายที่ฉันสงสัย แต่ฉันสนใจที่จะดูว่ามีคนอื่นมีวิธีหรือไม่ ฉันคิดว่าทางออกที่ดีที่สุดของคุณคือการเขียนสคริปต์เป็น untar เปลี่ยนชื่อและ re-tar
Kevin

คำตอบ:


8

ไม่ควรยากอย่างน้อยสำหรับไฟล์เก็บถาวรที่เข้ากันได้กับรูปแบบแบบเก่าที่ชื่อไฟล์ถูกจัดเก็บในฟิลด์ขนาดคงที่ (100 ไบต์) แต่ฉันไม่รู้เครื่องมือที่สามารถเปลี่ยนชื่อ ไฟล์ในสถานที่ในการเก็บถาวร tar นอกจากนี้คุณยังต้องสร้างไฟล์ใหม่ด้วยไฟล์บีบอัดที่เก็บถาวร

มันควรจะง่ายยิ่งขึ้น แต่ฉันไม่รู้เครื่องมือที่มีอยู่ที่สามารถกรองไฟล์เก็บถาวรเปลี่ยนชื่อไฟล์ได้ คุณสามารถสร้างหนึ่งบนไลบรารี tar ในภาษาสคริปต์ ตัวอย่างเช่นที่นี่เป็นสคริปต์หลักฐานของแนวคิดที่จะเปลี่ยนชื่อไดเรกทอรีในน้ำมันดินที่เก็บโดยใช้Perl Archive::Tarกับ มีการโหลดไฟล์เก็บถาวรลงในหน่วยความจำทั้งหมด นี้เป็นข้อ จำกัด Archive::Tarที่แท้จริงของ

#!/usr/bin/env perl
## Usage: tar-rename OLDPREFIX NEWPREFIX
use strict;
use warnings;
use Archive::Tar;
my ($from, $to) = @ARGV;
my $tar = Archive::Tar->new(\*STDIN);
foreach my $file ($tar->get_files()) {
    my $name = $file->name;
    $name =~ s~\A\Q$from\E($|/)~$to$1~;
    $file->rename($name) unless $name eq $file->name;
}
$tar->write(\*STDOUT);

GNU tar ไม่สามารถเปลี่ยนชื่อสมาชิกได้ทันที แต่pax(การแทนที่ POSIX สำหรับcpioและtar) ทำได้ อย่างไรก็ตามคุณไม่สามารถpaxอ่านและเขียนจากไฟล์เก็บถาวรได้ สิ่งที่คุณสามารถทำได้คือการเปิดเผยข้อมูลที่เก็บเป็นต้นไม้ประจำผ่านAVFSpaxและสร้างที่เก็บถาวรใหม่ด้วย สิ่งนี้จะเก็บชื่อไฟล์ (ยกเว้นที่ถูกแปลง), เนื้อหา, เวลาและโหมด แต่จะรีเซ็ตความเป็นเจ้าของไฟล์ให้กับคุณ

mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz

GNU Tar มี--transformมาตั้งแต่อย่างน้อยปี 2010 ที่อนุญาตให้เปลี่ยนชื่อไฟล์ได้ทันที ตัวอย่างเช่นดู: scriptsandoneliners.blogspot.com/2019/11/…
A.Danischewski

@ A.Danischewski --transformให้คุณเปลี่ยนชื่อไฟล์เมื่อคุณสร้างหรือแยกไฟล์เก็บถาวร แต่คุณจะเปลี่ยนชื่อไฟล์ในไฟล์เก็บถาวรอย่างไรโดยไม่แตกไฟล์ออกมา? (การแยกไม่ใช่วิธีแก้ปัญหาที่ดี: คุณอาจมีพื้นที่ว่างในดิสก์ไม่เพียงพอคุณอาจไม่มีสิทธิ์ในการเก็บข้อมูลความเป็นเจ้าของคุณอาจไม่มีความสามารถในการรักษาเวลาประทับอย่างแน่นอน ... )
Gilles 'หยุดชั่วร้าย'

โอเคใช่แล้วฉันเพิ่งเห็นสถานะโพสต์ของคุณว่า "GNU tar ไม่สามารถเปลี่ยนชื่อสมาชิกได้ทันที" - แต่ทำได้เฉพาะทางเข้า / ออกเท่านั้น หากคุณต้องการเปลี่ยนชื่อภายในไฟล์เก็บถาวรที่มีอยู่คุณสามารถใช้ไฟล์เก็บถาวรเพื่อเมานต์ลงในไดเรกทอรีเปลี่ยนชื่ออะไรก็ได้ที่คุณต้องการและยกเลิกการต่อเชื่อม
A.Danischewski

3

ทั้งคำตอบการแฮ็คและ Gilles ของ sr_ ดูดีมาก แต่หากปัญหาของคุณเป็นเพียงชื่อไดเรกทอรีรากของ tarball เป้าหมายในขณะที่รัน rpmbuild โซลูชันที่แตกต่างอาจจะกำหนด%setupมาโครใหม่เพื่อเปลี่ยนชื่อ dir ที่ต้องการ

สิ่งที่ชอบ (คุณจะต้องปรับตัวและปรับแต่งนี้กับการกำหนดค่าที่แท้จริงของคุณโดยเฉพาะอย่างยิ่งการเปลี่ยนold-dirและdesired-dirและการใช้เครื่องมือคลายขวา) ในของคุณ~/.rpmmacros:

%setup cd ../BUILD \
rm -rf cd-player \
bunzip2 -dc ../SOURCES/%{name}-%{version}.tar.bz2 | tar -xvvf - \
if [ $? -ne 0 ]; then \
  exit $? \
fi \
mv <old-dir> <desired-dir> \
cd <desired-dir> \
cd ../BUILD/cd-player \
chmod -R a+rX,g-w,o-w .

ฉันจะไม่ทำอย่างนั้นถ้าไม่ได้อยู่ในสถานการณ์ที่แปลกใหม่ที่สุด แต่คุณก็เป็นอย่างนั้น :)


2

เพียงดูหน้านี้ แต่พบคำตอบที่เหมาะสมที่อื่น:

http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html

มันบอกว่าคุณสามารถส่ง -n ไปยังมาโครการตั้งค่า% เพื่อบอก rpm สร้างชื่อของโฟลเดอร์ระดับบนสุดภายใน tarball


1

แฮ็คที่น่าเกลียด แต่อาจช่วยคุณได้โดยtarใช้ symlink:

$ mkdir a b
$ date >> b/foo
$ tar zcvf b-foo.tgz b/foo
$ rm -rf b
$ ln -s a b

$ tar zxvf b-foo.tgz                                                              
x b/foo: Cannot extract through symlink b
tar: Error exit delayed from previous errors.
$ tar zxvPf b-foo.tgz                                                             
x b/foo
$ ls a
foo

คิดเกี่ยวกับมันมันอาจจะไม่เป็นเช่นที่rpmจะไม่ให้คุณยุ่งกับข้อโต้แย้งไปtarได้หรือไม่ (แก้ไข: บางทีtarสคริปต์ห่อหุ้มที่ซับซ้อน$PATHอาจทำให้คุณคุ้นเคยกับเรื่องนี้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.