it-swarm-vi.com

Cách chọn tên thư mục trong quá trình gỡ lỗi

Nói rằng tôi có tập tin có tên ugly_name.tar, khi được trích xuất, trở thành ugly_name danh mục. Tôi có thể sử dụng lệnh nào để tên thư mục kết quả là pretty_name thay thế?

132
tshepang

Điều này sẽ làm việc:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1

-C thay đổi thư mục được chỉ định trước khi giải nén (hoặc đóng gói). --strip-components xóa số lượng thư mục được chỉ định khỏi tên tệp được lưu trữ trong kho lưu trữ.

Lưu ý rằng điều này không thực sự di động. GNU tar và ít nhất một số tars BSD có --strip-components tùy chọn, nhưng dường như không tồn tại trên các nền tảng giống như unix khác.

Cách làm việc ngu ngốc này sẽ làm việc khá nhiều ở mọi nơi mặc dù.

tar xf ugly_name.tar && mv ugly_name pretty_name
187
Mat

Với GNU tar .161.16, sử dụng --transform để áp dụng chuyển đổi sed regrec cho mỗi tên tệp (phép chuyển đổi được áp dụng trên đường dẫn đầy đủ trong kho lưu trữ):

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'

Nếu ugly_name là thành phần toplevel của tất cả các tên tệp trong kho lưu trữ, bạn không cần phải bận tâm với kết hợp chính xác:

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

Nếu bạn không biết tên của thư mục toplevel, bạn vẫn có thể sử dụng phương thức này, mặc dù bạn có thể thích --strip-components thay vào đó.

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

Với pax , tiện ích lưu trữ POSIX, sử dụng -s tùy chọn, lấy một biểu thức thay thế giống như sed làm đối số.

pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'

Cách đơn giản nhất

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
11
marquicus

Dùng cái này :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

Từ AskUbfox, điều này câu trả lời làm việc cho tôi:

tar zxvf ugly_name.tgz --one-top-level=pretty_name

`--one-top-level [= dir] '

Nói với tar để tạo một thư mục mới bên dưới thư mục trích xuất (hoặc thư mục được truyền cho `-C ') và sử dụng nó để bảo vệ chống lại tarbomb. Trong trường hợp không có đối số dir, tên của thư mục mới sẽ bằng với tên cơ sở của kho lưu trữ (tên tệp trừ đi hậu tố lưu trữ, nếu được công nhận). Bất kỳ tên thành viên nào không bắt đầu bằng tên thư mục đó (sau khi chuyển đổi từ `--transform 'và` --strip-thành phần') sẽ được thêm tiền tố vào nó. Các hậu tố tên tệp được nhận dạng là `.tar 'và bất kỳ hậu tố nén nào có thể nhận ra bằng See - tự động nén .


Cập nhật

Như đã chỉ ra trong bình luận , phương pháp này không hoạt động đối với tài liệu lưu trữ được hình thành đúng cách, tuy nhiên như câu trả lời khác cho thấy, bạn nên thêm --strip-components 1 để điều này thực sự hoạt động. Tôi đã thử nghiệm với tùy chọn mới này và nó hoạt động cả cho các tài liệu lưu trữ có tên cấp cao nhất và không có tên cấp cao.

3
smac89