Làm thế nào để gỡ bỏ một cách an toàn, mà không gây ô nhiễm thư mục hiện tại trong trường hợp tarbomb?


33

Dự án đáng kính phát hành tài liệu lưu trữ tar có chứa một thư mục duy nhất, ví dụ zyrgus-3.18.tar.gzcó chứa một zyrgus-3.18thư mục mà lần lượt chứa src, build,dist vv

Nhưng một số dự án punk đặt mọi thứ ở gốc: '- (Điều này dẫn đến một mớ hỗn độn khi hủy lưu trữ. Tạo thư mục thủ công mỗi lần là một nỗi đau và hầu như không cần thiết trong hầu hết thời gian.

  • Có cách nào cực nhanh để biết liệu tệp .tar hoặc .tar.gz có chứa nhiều hơn một thư mục ở gốc không? Ngay cả đối với một kho lưu trữ lớn.
  • Hoặc thậm chí tốt hơn, có một công cụ trong những trường hợp như vậy sẽ tạo một thư mục (tên của kho lưu trữ mà không có phần mở rộng) và đặt mọi thứ vào bên trong?


2
Tôi nghĩ rằng bao bì bị hỏng đáng báo cáo lỗi cho tác giả gói.

14
Từ trước đến nay, tôi đã có lịch sử (từ giữa những năm 90) luôn luôn được đưa vào thư mục con. Nếu tất cả được đặt vào một thư mục duy nhất (như mong muốn), thì nội dung của nó có thể được chuyển đến đúng vị trí với mv, sau đó bạn có thể xóa thư mục phụ thừa. Có thêm hai bước, nhưng nó đánh bại việc dọn dẹp mớ hỗn độn từ một tập tin tar bị làm sai.
TED

6
But some punk projects put everything at the root :'-(Và một số dự án punk đặt mọi thứ vào một thư mục hoàn toàn không cần thiết, xem xét rằng họ đã đặt mọi thứ vào một kho lưu trữ kèm theo, để khi bạn tải xuống và giải nén nó vào thư mục của chính nó như bất kỳ người dùng thông minh nào, bạn sẽ kết thúc với tất cả nội dung chôn một lớp khác xuống. ;-)
Mason Wheeler

2
@MasonWheeler Có một loại "tiêu chuẩn thực tế" cho kho lưu trữ tar để có mọi thứ trong một thư mục bên trong.
glglgl

Câu trả lời:


30

patool xử lý các loại lưu trữ khác nhau và tạo thư mục con trong trường hợp kho lưu trữ chứa nhiều tệp để tránh làm lộn xộn thư mục làm việc với các tệp được trích xuất.

Trích xuất kho lưu trữ

patool extract archive.tar

Để có được một danh sách các định dạng được hỗ trợ, sử dụng patool formats.


FYI: Tìm thấy nó tại sourceforge.net/projects/patool . Đó là một vòng / phút và tôi đã sử dụng alienđể chuyển đổi nó thành một bản sửa lỗi cho Ubuntu.
Joe

patoolphải có trong repos cho Debian và Ubuntu nếu bạn đang chạy phiên bản hiện tại.
Marco

12

Bạn có thể làm một cái gì đó như

tar tf thefile.tar | cut -d/ -f1 | sort -u

để xem những mục cấp cao nhất mà tar có; ống để wc -lkiểm tra nếu có nhiều hơn một. Lưu ý rằng có một vài trường hợp điều này sẽ thất bại, ví dụ: nếu tar chứa đường dẫn tệp có dạng somedir/whatevervà cả ./somedir/whatever(hoặc một cái gì đó điên rồ hơn); điều này là không phổ biến, mặc dù.

Điều này sẽ đọc toàn bộ tập tin tar trước khi xuất ra bất cứ điều gì, bởi vì sort , mặc dù nó sẽ nhanh hơn trích xuất vì nó chỉ là một lần đọc tuần tự và nó có thể bỏ qua các tệp lớn.

Nếu bạn đang thực hiện việc này một cách tương tác và tệp có thể lớn, bạn có thể thay đổi sort -uthành uniqControl+ Cnếu nó in ra nhiều thứ.


2
sort | uniqcó thể rút ngắn thành sort -u.
Marco

4
trừ khi bạn muốn làmuniq -c
cas

7

bạn có thể làm:

pax <some.tar

... Để liệt kê nội dung của một tartập tin.

Nếu bạn muốn biết nó đi sâu bao nhiêu cấp, bạn có thể làm:

pax <some.tar | tr -dc /\\n | sort -r | head -n1

bạn rõ ràng có thể cấm một vụ nổ khi trích xuất với:

mkdir some.tar
pax -'rs|^|some.tar/|' <some.tar

2

Điều này nên làm những gì bạn muốn. Tôi chắc rằng ai đó có thể cải thiện nó. Trong các ví dụ này, tôi giả sử một kho lưu trữ tar nén gzip vì đây là phổ biến nhất.

Bạn muốn có một kho lưu trữ trong đó không có các nút anh chị em trong cây thư mục cấp gốc.

Mỗi mục trong danh sách nội dung tar phải bắt đầu với cùng một mẫu. Mẫu này là đường dẫn thư mục cơ sở mà tất cả các mục trong kho lưu trữ phải chia sẻ. Nếu bất kỳ hai mục nhập không bắt đầu với cùng một mô hình thì họ là anh em ruột.

Dòng đầu tiên trong danh sách nội dung tar sẽ cung cấp cho bạn mẫu tối thiểu bạn cần kiểm tra. Đây là CƠ SỞ.

BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))

Sau đó, để kiểm tra cho tarball nổ bạn cần phải kiểm tra xem bất kỳ dòng của danh sách nội dung tar không bắt đầu với BASEPATH.

tar ztf example.tar.gz | grep -qv "^${BASEPATH}"

Biến điều này thành một hàm shell:

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

Từ đây bạn có thể viết một chức năng trích xuất lưu trữ tar an toàn.

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

safe_tar_x() {
    TARBALL_NAME=$1
    if is_explosive ${TARBALL_NAME}; then
        SUBDIR=${TARBALL_NAME%.tar.gz}
        SUBDIR=${SUBDIR##*/}
        mkdir "${SUBDIR}"
        echo "WARNING: This tarball is explosive. Opening in subdirectory, ${SUBDIR}, for safety." >&2
    else
        SUBDIR="."
    fi
    # Tar quirks: "--directory" must be last, and using more than
    #     one option group requires that all groups start with a dash.
    tar -zxf "${TARBALL_NAME}" --directory "${SUBDIR}"
    return $?
}

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.