Làm cách nào để giải nén tập tin sang thư mục khác bằng lệnh 'tar'?


672

Tôi nghĩ rằng tar archive.tar /users/mylocationsẽ làm việc, nhưng nó không. Làm thế nào tôi có thể làm điều đó?


1
Ngoài ra, -C, --directory DIR\n change to directory DIRnên được mô tả như là change output directory to DIR (will fail if DIR doesn't exist). Cảm ơn @Mich. Xem thêm câu trả lời của @ Bryan_Larsen.
hợp lệ

1
@Ujjwal Sing: Thật vậy, trang tar man không hữu ích lắm. Nó mô tả "-C DIR" là "thay đổi thư mục DIR". Thậm chí tệ hơn: "tar -C mydir xf archive.tar" không hoạt động, trong khi "tar xf archive.tar -C mydir" thì không.
Pat Morin

@PatMorin Công bằng mà nói, một khi bạn hiểu các quy ước gọi đối số mà bạn đang sử dụng thì nó có ý nghĩa. Bạn cũng có thể làm tar xfC archive.tar mydirhoặc tar -C mydir -xf archive.tar. Nó chỉ pha trộn các kiểu cờ truyền thống và kiểu GNU phá vỡ mọi thứ, vì ... thực sự là loại được mong đợi. Các cờ truyền thống được truyền tất cả dưới dạng một đốm màu làm đối số đầu tiên. Bạn không thể mong đợi họ làm việc nếu họ không phải là người đầu tiên. (Ý tôi là, vâng, dù sao cũng có thể diễn giải nó - quan điểm của tôi là ở trên và vượt xa, không phải tiêu chuẩn)
Nic Hartley

Câu trả lời:


958

Để trích xuất một kho lưu trữ vào một thư mục khác với hiện tại, hãy sử dụng tùy chọn, -Choặc --directory, tar, như trong

tar -xf archive.tar -C /target/directory

Lưu ý rằng thư mục đích phải tồn tại trước khi chạy lệnh đó (nó có thể được tạo bởi mkdir /target/directory).

Đọc trang hướng dẫn (lệnh man tar:) để biết các tùy chọn khác.


Đường dẫn có thể bị tước không: tức là chỉ cần truy xuất tệp
zzapper

3
Nếu đó là một tệp lớn hơn, khi bạn chạy lệnh, tất cả những gì bạn nhận được là không có đầu ra trong vài giây hoặc thậm chí vài phút trong khi nó hoạt động. Bạn có thể khắc phục điều này bằng cách thêm -vcờ ( chế độ dài dòng ) liệt kê tên của mỗi tệp khi giải nén nó.
IQAndreas

Nếu bạn gặp rắc rối với điều này, hãy lưu ý --strip-components=1lời khuyên từ câu trả lời khác.
DreadPirateShawn


9
Chẳng có gì đáng ngạc nhiên, sau ngần ấy năm, với tất cả các tùy chọn tarđã được tích lũy, vẫn không có tùy chọn nào để tạo thư mục đầu ra nếu nó không tồn tại ?
EM0

261

Lưu ý rằng nếu tarball của bạn đã chứa tên thư mục bạn muốn thay đổi, hãy thêm --strip-components=1tùy chọn:

tar xf archive.tar -C /target/directory --strip-components=1

2
Cảm ơn bạn. Tải xuống qua wget / etc luôn có thư mục 'cha mẹ'. Đây là câu trả lời hoàn chỉnh imo - hoặc nên được lưu ý trong câu trả lời ở trên.
bshea

Chỉ cần những gì tôi đang tìm kiếm. --strip-componentsrất hữu ích khi chạy các nhà cung cấp có thể sử dụng các phiên bản khác nhau. Cách này /target/directorycó thể là một tên chung, mà không phải lo lắng về cách nhà cung cấp chọn đặt tên thư mục lưu trữ của họ.
Jack_Hu

30

Kết hợp các câu trả lời và nhận xét trước đó:

Để chỉ cần trích xuất nội dung và tạo thư mục đích nếu nó bị thiếu:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Để giải nén và cũng loại bỏ thư mục gốc (cấp độ đầu tiên) trong zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1

20

Một lựa chọn khác là sử dụng --one-top-level. Điều này sẽ tự động tạo một thư mục dựa trên tên tệp của bản gốc.

tar zxvf filename.tgz --one-top-level

Ngoài ra nếu bạn muốn, bạn có thể chỉ định của riêng bạn và tar sẽ tự động tạo nó.

tar zxvf filename.tgz --one-top-level=new_directory

3
Tôi đang sử dụng GNU tar 1.26 và tôi gặp lỗi tùy chọn không được nhận dạng cho--one-top-level
Emma Strubell

Đây là câu trả lời tôi cần. Rất "hữu ích" để chỉ định tên thư mục hoặc nhớ mã đặc biệt sẽ quay lại tệp cho tên. Cảm ơn bạn.
Hypocritus

2

Điều tôi thấy thú vị liên quan đến trích xuất là, nó phụ thuộc vào cách bạn tạo tệp lưu trữ, xem ví dụ này

cd /tmp
mkdir folder
touch folder/file.txt

khi bạn làm tar -zcvf folder.tar.gz foldermọi thứ như mong đợi = khi bạn gỡ bỏ nó bây giờ nó sẽ được gỡ bỏ (thư mục sẽ được tạo, nếu bạn xóa nó) như /tmp/folder/.

Nhưng, khi bạn sẽ tạo tar as tar -zcvf tmp-folder.tar.gz /tmp/foldervà bạn gỡ nó trong thư mục / tmp, kết quả sẽ là /tmp/tmp/folderthư mục! Trong trường hợp như vậy, bạn phải gỡ bỏ nó thành / -tar -xf tmp-folder.tar.gz -C /


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.