tập tin .tar không có cấu trúc thư mục


32

Tôi đang .taring một số tập tin với đường dẫn example/super_user/Output.*.

Kết quả .tartrông như thế này:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Nhưng tôi muốn các tập tin như sau:

- Output.zip
- Output.xml
- Output.txt

Bạn có biết làm thế nào tôi có thể đạt được điều này trong khi vẫn ở trong một thư mục khác?


Hãy chắc chắn để tránh tarbombs với tài liệu lưu trữ như thế.
grawity

tar --strip-thành phần = 1000?
Zaar Hai

Câu trả lời:


11

tar sẽ bảo vệ cấu trúc tệp và thư mục vì vậy tôi không nghĩ có cách nào để hướng dẫn tar làm phẳng hệ thống phân cấp tại thời điểm tạo.

Một cách giải quyết khác là tạm thời thay đổi thư mục, tạo tar, sau đó quay lại - một ví dụ nhanh dưới đây:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

Nếu thư mục 'ví dụ' nằm ở thư mục gốc của hệ thống tập tin, thì đây là một cách khác:

tar -C /example/super_user -cvf result.tar .

điều này sẽ thay đổi thư mục đến điểm mà bạn muốn làm tar. Thông báo trước là nếu có bất kỳ thư mục con nào dưới / example / super_user, cấu trúc thư mục sẽ được giữ nguyên cho các thư mục con này.


1
Đây là câu trả lời cho vấn đề trong tầm tay. Sự cảnh báo được đề cập không phải là một vấn đề trong trường hợp này. Tất cả các câu trả lời khác là cách giải quyết để giải thích cho các biến thể của vấn đề.
joki

Đó thực sự là giải pháp cho câu hỏi này. Thư mục không phải là root, giả sử cấu trúc thư mục /home/u/foo/bar, thư mục làm việc là /home/b, sau đó tar -C foo/bar -cvf qiz.tar .hoạt động tốt. Một báo trước, mặc dù là bạn không thể sử dụng ký tự đại diện, tức là tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"hoặc tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"sẽ không làm việc.
Brice

1
Cần lưu ý rằng bạn có thể sử dụng -Cnhiều lần trong một tarlệnh nếu bạn cần thêm nhiều tệp trải rộng trên nhiều thư mục nhưng vẫn muốn tệp tar bị xẹp.
zero298

10

Tôi đã đăng câu trả lời của mình ở đây:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory- cấu trúc

repost (cho ppl lười biếng)


Điều này thật xấu xí ... nhưng nó hoạt động ...

Tôi đã có cùng một vấn đề nhưng với nhiều thư mục, tôi chỉ muốn xóa mọi tập tin. Bạn có thể sử dụng tùy chọn "biến đổi" để chuyển một biểu thức sed và ... nó hoạt động như mong đợi.

đây là biểu thức:

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

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

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


7

Để tạo tar (ARCHIVE.tar) với tất cả các tệp từ một thư mục (DIR), không có bất kỳ thông tin thư mục gốc nào (không phải ./), bạn có thể sử dụng một cái gì đó như:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Bạn có thể chơi với tìm để giới hạn độ sâu, chọn các tệp cụ thể và nhiều thứ khác.

Chúc may mắn!


Tôi đang nhận được "find: -printf: không biết chính hoặc toán tử" tại lệnh tìm OSX. Bất cứ lời khuyên?
TCB13

-printflà một lệnh không chuẩn. Nhiều trong số đó chỉ hoạt động với các phiên bản cụ thể của tìm kiếm. Thông thường chúng tôi đánh dấu những người đó khi trả lời một câu hỏi trên Siêu người dùng (ví dụ: "-blah là tiện ích mở rộng Gnu và sẽ không hoạt động ở mọi nơi").
Hennes

3

Tôi đã tạo một thư mục tạm thời. Và trong thư mục, đã tạo các liên kết tượng trưng cho tất cả các tệp đến các tệp được bao gồm. Sau đó, tôi đã làm tar -h -C. sao cho tất cả các tệp (không phải liên kết, nhưng nội dung của chúng) được bao gồm trong kho lưu trữ với tên mong muốn.


1

Nếu đó là toàn bộ nội dung của tarball thì bạn có thể sử dụng --strip-componentstùy chọn GNU tar để xóa 2 cấp độ trước các tệp.


Tôi chỉ có tùy chọn --strip-pathnhưng sử dụng nó sẽ không thay đổi gì cả.

1

Một cách khác để thư mục thay đổi tạm thời là đặt các lệnh cdtartrong ngoặc đơn ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

Ưu điểm của việc này là, bạn sẽ luôn ẩn trở lại thư mục gốc khi khối được hoàn thành. tức là không cần pushd.. popdkhối hoặc theo dõi nơi cdquay lại.


0
pushd example/super_user
tar -cf output.tar Output.*
popd

Pushd đẩy đường dẫn thư mục hiện tại vào DIRngăn xếp và di chuyển đến thư mục nội dung. Sau đó, bạn di chuyển trở lại thư mục gốc bằng cách sử dụng popd.

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.