Câu trả lời:
Đ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.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
thư mục. Nhân tiện, vẻ đẹp là trong mắt của kẻ si tình.
Với GNU tar .161.16, sử dụng --transform
để áp dụng chuyển đổi reg reg sed 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 bận tâm đến việc khớ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 pháp này, mặc dù bạn có thể thích --strip-components
thay thế.
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 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!'
Dùng cái này :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
toán tử danh sách giữa hai lệnh đó, vì vậy lệnh thứ hai chỉ được thực hiện nếu lệnh thứ nhất thành công.
ugly_name
đã tồn tại.
Cách đơn giản nhất
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
không --strip-components 1
. (2) Ngược lại, câu trả lời được chấp nhận (đăng bởi Mat) tính năng --strip-components 1
mà không cần --one-top-level=pretty_name
. (3) Bạn có thể giải thích tại sao câu trả lời của bạn, kết hợp các tùy chọn này, tốt hơn bất kỳ câu hỏi nào không? Xin vui lòng không trả lời trong các ý kiến; chỉnh sửa câu trả lời của bạn để làm cho nó rõ ràng và đầy đủ hơn.
--strip-component 1
là bắt buộc, với phương thức mkdir
hoặc --strip-components 1
phương thức, nếu không bạn chỉ cần lấy pretty_name/ugly_name/
.
Từ AskUbfox, câu trả lời này có hiệu quả với 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 -auto-compression .
Như đã chỉ ra trong các bình luận , phương pháp này không hoạt động đối với các tài liệu lưu trữ được hình thành đúng cách, tuy nhiên như một 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ự hiệu quả. 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.
pretty_name
, với thư mục cấp cao nhất ban đầu bên trong đó. Ví dụ: nếu tar xzf ugly_name.tgz
sẽ tạo một thư mục được gọi ugly_name/
, thì lệnh bạn đã cung cấp sẽ tạo pretty_name/ugly_name/
.