Chuẩn bị tiền tố trong tar


15

Tôi hiện đang làm trong một shellscript rất không hiệu quả:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

Tôi muốn mọi thứ được chứa trong thư mục có tên $ VERSION - có cách nào để làm điều này mà không phải sao chép mọi thứ như trong đoạn script trên không?


Tại sao sao chép nó ở nơi đầu tiên? Tại sao không tar cjf archive.tar.bz2 $MYPATH?
Chewie

1
@Chewie anh nói, anh muốn phiên bản $ là thư mục gốc trong kho lưu trữ.
Kent

Ồ, tôi thấy nó bây giờ.
Chewie

Câu trả lời:


24

Phiên bản GNU tarhỗ trợ --transformtùy chọn (và bí danh của nó --xform), bạn có thể sử dụng nó như thế này

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

Ví dụ, cho cây thư mục này

foo
└── foo.txt

lệnh

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

sẽ tạo ra một kho lưu trữ như

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
Đáng chú ý là cách tiếp cận này có thể phá vỡ các liên kết tượng trưng. Chuẩn bị flags=r;giải quyết vấn đề như được đề cập trong stackoverflow.com/a/29661783/388804 .
eregon

không bao gồm một dấu gạch chéo; khi tôi đặt dấu gạch chéo trong biến đổi, tiền tố ban đầu bị bỏ qua; ví dụ s/^a\//b\//, các tar -tchương trình vẫn còn a/trong khi tất cả các file khác đang được b/; Tôi cho rằng điều này là nguy hiểm và tôi thực sự không cần phải bảo vệ chống lại một số tệp khác có cùng tiền tố không phải là một thư mục trong tệp tar; Vì vậy, không có dấu gạch chéo nào là tốt, tôi không ngại biết cách tốt nhất để xử lý trường hợp a/bị biến đổi nhưng không phải aa/là anh chị em của nút gốc.
ThorSummoner

14

Để tar thư mục hiện tại và thêm tiền tố, điều này làm việc cho tôi:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

Nếu bạn có thể thoát khỏi mà không lưu giữ các liên kết tượng trưng trong cây tệp bạn đang ghi, bạn có thể làm

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

Các hphương tiện tùy chọn dereference symlink, tức là bao gồm các tập tin hoặc thư mục mà các điểm liên kết đến chứ không phải chỉ đơn giản là ghi lại thực tế rằng có một liên kết tượng trưng và những gì nó trỏ đến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.