root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Làm thế nào tôi có thể giải quyết vấn đề này và giữ /
tên tập tin?
-C /
khi giải nén nó.
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Làm thế nào tôi có thể giải quyết vấn đề này và giữ /
tên tập tin?
-C /
khi giải nén nó.
Câu trả lời:
Sử dụng --absolute-names
hoặc -P
tùy chọn để vô hiệu hóa tính năng này.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
-C /
tùy chọn như được mô tả trong câu trả lời của @Marcus sẽ loại bỏ thông báo STDERR nếu đó là mục tiêu chính của bạn.
Đó thực sự là một tính năng, không phải là một vấn đề. Lưu trữ với vị trí tuyệt đối là một rủi ro bảo mật. Kẻ tấn công có thể sử dụng tài liệu lưu trữ như vậy để lừa người dùng cài đặt tệp ở các vị trí hệ thống quan trọng.
Vâng, bạn có thể sử dụng -P
. Nhưng có gì sai khi cho phép tar loại bỏ dấu gạch chéo về phía trước và chỉ cần yêu cầu người dùng kho lưu trữ thực hiện trích xuất trong thư mục gốc? Sau đó, họ có ý thức tác động đến các vị trí hệ thống quan trọng và không thể làm điều đó một cách tình cờ.
tar
. Thông báo cụ thể này đã khiến tar
thoát ra với trạng thái 1
, khiến tôi nhận được thông báo email sai về các bản sao lưu thành công, đơn giản chỉ vì tar
đã viết tin nhắn này cho STDERR. Tôi đã khắc phục sự cố này bằng cách sử dụng phiên bản tinh chỉnh của giải pháp @ Marcus's:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
- ví dụ: nếu bạn đang cung cấp một số loại tính năng chụp nhanh hệ thống tệp trong FUSE. Đôi khi bạn có thể muốn gỡ bỏ một ảnh chụp nhanh trong một thư mục cụ thể thay vì cwd
theo quan điểm của người dùng.
Nếu bạn muốn thoát khỏi "Loại bỏ` / 'hàng đầu khỏi tên thành viên "đang được in thành STDERR, nhưng vẫn muốn loại bỏ các dấu gạch chéo hàng đầu như tar một cách khôn ngoan, tôi đã thấy một giải pháp tuyệt vời ở đây bởi timsoft bình luận.
Giải pháp liên quan đến việc sử dụng tùy chọn -C để thay đổi thư mục thành thư mục gốc (/), sau đó chỉ định cây tệp để lưu trữ mà không có dấu gạch chéo hàng đầu, vì bây giờ bạn chỉ cần một đường dẫn tương đối. Điều này thực hiện tương tự như một lệnh tạo tar bình thường, nhưng không cần tước bỏ:
tar fcz bkup.tar.gz -C / home/foo/
tar c -C / home/foo/*
), vì shell không biết về root đã thay đổi. Nhưng vẫn là một câu trả lời tốt cho các trường hợp khác.
-C /
không làm việc cho tôi, thời gian. Nó không ngăn cản stderr cho tôi.
Một tháng trễ, nhưng tôi tìm thấy giải pháp thích hợp nhất cho trường hợp của mình (trong tập lệnh shell) là vào thư mục cha và thực thi lệnh ở đó.
cd /var/www/
tar -czf mysite.gz mysite
Thay vì:
tar -czf /var/www/mysite.gz /var/www/mysite
Đây là cách tôi đã làm bằng cách sử dụng phương pháp vũ phu : 2>&1 | grep -v "Removing leading"
.
Ví dụ:
tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v "Removing leading"
tar
Lệnh của tôi có thể trở lại 2
khi lỗi nghiêm trọng.
Tôi đã giải quyết vấn đề này với:
cd /home/foo && tar czf ~/backup.tar.gz .
theo cách đó, bạn không cố gắng đặt đường dẫn tuyệt đối vào kho lưu trữ tar ở vị trí đầu tiên. Nếu bạn muốn gỡ bỏ nó ở thư mục gốc của hệ thống tập tin, bạn chỉ cần
cd / && tar xzf backupt.tar.gz
sau khi chuyển nó