tar - giải nén cấu trúc thư mục


34

unzipcó một tùy chọn tiện lợi -j, theo đó cấu trúc thư mục của kho lưu trữ bị loại bỏ và tất cả các tệp được trích xuất vào cùng một thư mục.

Có cách nào làm cho tarcông việc theo cùng một cách? Không có gì trong trang người đàn ông dường như chỉ ra như vậy.

Vì vậy, có một công cụ thay thế, tốt nhất là Phần mềm Tự do, sẽ làm điều đó không?


Câu trả lời:


79

GNU tar sống trên viêm featur, do đó, tự nhiên cũng có một số tùy chọn cho điều đó.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Nếu bạn chỉ muốn xóa một vài đoạn đường, sau đó --strip-components=nhoặc --strip=nthường xuyên sẽ làm:

 tar xvzf tgz --strip=1

Nhưng bạn cũng có thể viết lại các tệp cần trích xuất (các cờ được --transformhoặc --xformchấp nhận ereg với /xmodifer):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Để liệt kê một tar bạn cần --show-transformedtùy chọn bổ sung :

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

Tôi tin rằng các tùy chọn viết lại cũng hoạt động để đóng gói, không chỉ để giải nén. Nhưng paxrõ ràng có một cú pháp đẹp hơn.


4
Tại sao không s#.*/##?
l0b0

3
--strip chỉ làm cho ngày của tôi. Cảm ơn!
SamStephens

--stripkhông được đề cập trong trang os x tar man, nhưng dù sao nó cũng hoạt động, cảm ơn!
slf

3
Tốt hơn nhiều so với câu trả lời được chấp nhận.
Klaatu von Schlacker

Có sự khác biệt nào giữa --strip--strip-componentskhông?
Joel Berkeley

13

Bạn có thể làm điều đó khá dễ dàng trong hai bước. Thích nghi khi cần thiết:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree

đây là cách tôi sẽ làm điều đó (sử dụng find -exec mv -ithay vì find | xargs) .... các bước đơn giản tôi có thể lặp lại trên bất kỳ hệ thống nào mà không phải mang theo một kịch bản để làm điều đó cho tôi.
quack quixote

1
+1, tmpdir=$( mktemp -d )rất tiện lợi khi tạo thư mục tạm thời
sorki

8

pax có thể làm được:

pax -v -r -s '/.*\///p' < archive.tar

hoặc là

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

Bạn có thể kiểm tra hoạt động thay thế tên trước bằng cách bỏ -rtùy chọn.


1

Một giải pháp có thể không yêu cầu cài đặt bất cứ thứ gì.

  1. sử dụng tar tvfđể lấy tất cả các tập tin từ tarball
  2. Trích xuất các tệp riêng lẻ - có trích xuất tar vào thiết bị xuất chuẩn & chuyển hướng đến tên tệp $

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

lưu dưới dạng extract.sh và chạy như extract.sh myfile.tar. Nó cũng sẽ ghi đè bất kỳ tên tệp trùng lặp nào gặp phải trong các thư mục được lấy từ tarball.


Trên thực tế tôi chỉ thử nghiệm nó trên một số cây dir ở nhà & Nó thất bại trên các tệp có chứa khoảng trắng. Tôi sẽ xem nếu tôi không thể đăng cập nhật.
DaveParillo

Đã sửa nó, nhưng nó không đẹp như vậy.
DaveParillo

-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

Các -Otùy chọn trích ra một tập tin để ra tiêu chuẩn, và >đổi hướng đầu ra vào một tập tin. Vì vậy, trong ví dụ của tôi, tôi đang giải nén foo.mp3 và chuyển hướng nó vào bar.mp3. Tên tập tin là tùy ý.

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.