chỉ các tập tin danh sách tar


16

Sự thật thú vị: Nếu bạn sử dụng Trình quản lý lưu trữ và trích xuất .tar.gz để bạn không sử dụng "Giữ cấu trúc thư mục", bạn sẽ nhận được một tarbomb .

tar -ztfliệt kê tất cả các tập tin và thư mục trong một tập tin tar. Có cách nào để liệt kê tất cả các tệp trong một tệp tar mà không có cấu trúc thư mục không?


Bạn có thể có được hiệu ứng 'tarbomb' với tar xvzf my_tar.tar.gz --transform 's/.*\///'. Nhưng thật không may, điều đó không thay đổi cách nó hiển thị trong một danh sách tthay vì x.
ire_and_curses

4
Điều làm phiền tôi là các tài liệu lưu trữ có cấu trúc tốt có thể dễ dàng được sử dụng để tạo ra vũ khí khai thác hàng loạt.
Eero Aaltonen

Câu trả lời:


17

Tôi không thấy cách nào để làm điều đó từ trang man, nhưng bạn luôn có thể lọc kết quả. Giả định sau đây không có dòng mới trong tên tệp của bạn:

tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'

Làm thế nào nó hoạt động

Bằng cách đặt dấu tách trường thành /, trường cuối cùng awkbiết về ( $NF) là tên tệp nếu nó xử lý tên tệp hoặc trống nếu nó xử lý tên thư mục ( tarthêm dấu gạch chéo vào tên thư mục). Vì vậy, về cơ bản, chúng tôi đang nói awkđể in trường cuối cùng nếu nó không trống.


Công việc khá tuyệt vời với awk :)
Eero Aaltonen

5

Bằng cách sử dụng một gợi ý Joseph R. có thể sử dụng regex [^/]$để grepcho các tập tin bằng cách tìm kiếm dòng không kết thúc với /.

tar tzf archive.tar.gz | grep -e "[^/]$"


Điều đó vẫn đầu ra foo/bartrái ngược với chỉ bar. Bạn muốn grep -Eo '[^/]+$'(với GNU grep).
Stéphane Chazelas

4

Giả sử không có tên tệp nào chứa dòng mới:

tar -tf foo.tar | sed -e 's#.*/##' -e '\#.#!d'

Lệnh sed đầu tiên loại bỏ mọi thứ trước dòng cuối cùng /trên một dòng, do đó chỉ có phần tên tệp được in. Lệnh thứ hai xóa các dòng hiện đang trống, tức là các dòng kết thúc bằng a /, là các thư mục.


sed: -e biểu thức # 2, char 2: lệnh không xác định: `/ 'và cú pháp sed không cảm thấy rất .. trực quan
Eero Aaltonen

@EeroAaltonen Tôi đã sửa lệnh sed. Thật vậy, cú pháp hơi khó hiểu (tôi có bao gồm các giải thích trong câu trả lời của tôi).
Gilles 'SO- ngừng trở nên xấu xa'

2

Với pax(lệnh POSIX để đọc tartệp):

pax -'s@.*/@@' < file.tar

(liệt kê tất cả các tệp bất kể loại của chúng, bao gồm các thư mụ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.