2012-12-18 7 views
14

Khi tôi cố gắng nén tệp và thư mục bằng tar bằng đường dẫn tuyệt đối, đường dẫn tuyệt đối được giữ nguyên trong tệp nén kết quả. Tôi cần phải sử dụng đường dẫn tuyệt đối để nói cho tar nơi thư mục tôi muốn nén nằm, nhưng tôi chỉ muốn nó nén thư mục đó - không phải toàn bộ đường dẫn.Unix tar: không giữ cấu trúc thư mục

Ví dụ: tar -cvzf test.tar.gz /home/path/test - nơi tôi muốn nén thư mục test. Tuy nhiên, những gì tôi thực sự kết thúc nén là /home/path/test. Có điều gì có thể được thực hiện để tránh điều này không? Tôi đã thử chơi với toán hạng -C không có kết quả.

+0

Có ngữ cảnh lập trình cho điều này không? Nếu không, nó có thể thuộc về Unix.SE hơn là Stack Overflow. – dmckee

+0

true, mặc dù điều này có thể có liên quan trong shellscripting, nó không được gắn thẻ như vậy .. –

+0

Tôi đang sử dụng nó cho một kịch bản lệnh shell, nhưng tôi đã giảm vấn đề ra ngoài ngữ cảnh. Tôi có thể cần phải cung cấp thêm chi tiết (hay còn gọi là ngữ cảnh) để tìm một giải pháp, vì vậy tôi đã đăng ở đây. Tôi sẽ gắn thẻ nó ngay bây giờ. –

Trả lời

17

Sử dụng -C để xác định thư mục mà từ đó các tập tin trông giống như bạn muốn, và sau đó xác định các tập tin khi nhìn từ thư mục đó:

tar -cvzf test.tar.gz -C /home/path test 
+1

Điều này vẫn giữ cấu trúc thư mục * tương đối * với thư mục gốc đã chỉ định, không phải câu hỏi dường như đang hỏi (mặc dù rõ ràng là những gì OP cần), nhưng +1 bởi vì đó là chính xác những gì tôi đang tìm kiếm (và cách tiếp cận đơn phương-san phẳng trong câu trả lời khác có vẻ giống như một điều kỳ lạ để muốn). –

23

này là xấu xí ... nhưng nó hoạt động ...

Tôi đã gặp sự cố tương tự này nhưng với nhiều thư mục, tôi chỉ muốn căn hộ mọi tệp ra. Bạn có thể sử dụng tùy chọn "transform" để chuyển một biểu thức sed và ... nó hoạt động như mong đợi.

đây là các biểu hiện:

's/.*\///g' (xóa tất cả mọi thứ trước khi '/')

Đây là lệnh cuối cùng:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info 
+5

Đây là câu trả lời duy nhất tôi đã thấy * thực sự * làm những gì tôi đang tìm kiếm. –

+0

Kết quả tốt hơn cho nhiều thư mục có thể đạt được kết hợp với http://serverfault.com/a/566345/343194. Một cái gì đó như 'tìm ./commondir-type f | tar --transform 's /.*\/// g' -cvzf ./file.tar.gz --files-from =/dev/stdin'. Bằng cách này, thư mục con trống sẽ bị loại trừ. –

0

đa thư mục ví dụ

tar cvzf của tôi .tar.gz example.zip -C dir1 files_under_dir1 -C dir2 files_under_dir2

các tệp theo dir 1/2 không được có đường dẫn.