tar: Loại bỏ `/ 'hàng đầu khỏi tên thành viên


137
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?


2
Chính xác thì điều gì không hoạt động như mong đợi?

34
Nó không phải là vấn đề. Bạn không muốn dấu gạch chéo hàng đầu trong kho lưu trữ tar. Nghiêm túc. Nếu bạn muốn trích xuất một kho lưu trữ vào thư mục gốc của hệ thống, hãy chỉ định -C /khi giải nén nó.
ThiefMaster

Câu trả lời:


69

Sử dụng --absolute-nameshoặc -Ptù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

54
Đây là câu trả lời đúng, nhưng lưu ý rằng, trong hầu hết các trường hợp, đây không phải là điều bạn muốn , vì nó dẫn đến một kho lưu trữ trích xuất trong các đường dẫn hoàn chỉnh!
rubo77

8
Sử dụng -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.
Matt Sanders

1
Như @ rubo77 đã nhận xét, thường thì đây không phải là kết quả mong đợi của lệnh.
alfredocambera

3
Hầu hết thời gian, đây không phải là điều người dùng muốn, đơn giản là vì hầu hết họ không đọc hướng dẫn cho đến khi họ cần (không ai có thời gian cho việc đó). Vì vậy, sẽ là khôn ngoan khi, ít nhất, mở rộng câu trả lời của bạn, cảnh báo mọi người không làm điều này trừ khi họ hoàn toàn chắc chắn rằng họ hiểu tác dụng của nó là gì. Đặc biệt là được chấp nhận như một câu trả lời.
Mladen B.

1
@Toskan Ví dụ được thêm
Barmar

89

Đó 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ờ.


5
Đôi khi các tính năng là vấn đề. Tôi đã tìm thấy chủ đề này sau khi thiết lập một tập lệnh sao lưu sẽ gửi email về trạng thái thoát khác không tar. Thông báo cụ thể này đã khiến tarthoá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]
rubynorails

1
Tôi nghĩ rằng có một số trường hợp sử dụng để sử dụng -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ì cwdtheo quan điểm của người dùng.
DIMMSum

81

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/

Nó sẽ không hoạt động với các bản sao lưu gia tăng. Nhưng một câu trả lời tốt.
gajdipajti

Nó cũng không hoạt động nếu bạn muốn các tệp tar được biểu thị bằng cách mở rộng shell (ví dụ 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.
Boris

1
-C /không làm việc cho tôi, thời gian. Nó không ngăn cản stderr cho tôi.
Acumenus

3
@ABB đảm bảo đường dẫn sau -C / là tương đối.
zurfyx

Cách tiếp cận này có hiệu quả không nếu người dùng không có quyền trên thư mục gốc?
Mladen B.

31

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

9
Thật vậy, bạn có thể thực hiện nó bằng cách sử dụng: tar -zcvf mysite.gz -C / var / www / mysite / Lợi ích của việc này là bạn có thể thực thi nó từ bất kỳ thư mục nào
alfredocambera

Cảm ơn sự giúp đỡ của bạn. Đây là những gì tôi cần. Tôi không muốn đường dẫn đầy đủ trong tarball của mình, chỉ là thư mục đích.
Christia

Điều này có lẽ nên được chấp nhận như một câu trả lời chính xác, tôi nghĩ vậy.
Mladen B.

Tôi không thấy làm thế nào điều này trả lời câu hỏi cả. Đó là một cái gì đó khác nhau có thể được thực hiện. Sầu muộn Như: Q: Làm thế nào để tôi đi từ Los Angeles đến New York? A: Đi đến San Francisco thay thế.
G-Man

Tôi đồng ý với @ G-Man. Điều này sẽ dẫn đến một tệp tar với cấu trúc thư mục hoàn toàn khác. Trong một số trường hợp, cấu trúc thư mục đó thực sự phù hợp hơn ở nơi đầu tiên, nhưng nó không trả lời câu hỏi.
Kevin Keane

7

Đâ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"

4
Vấn đề với điều này là nó ẩn mã lỗi. Vì vậy, nếu bạn muốn kiểm tra mã lỗi từ tar trong tập lệnh bash, thì nó sẽ không trả về 0 khi thành công.
Brian

@staticx, mã lỗi là 0 bất kể.
Acumenus

1
@ABB tarLệnh của tôi có thể trở lại 2khi lỗi nghiêm trọng.
Jite

1
@Brian bạn có thể sử dụng $ PIPESTATUS để lấy mã thoát. Xem unix.stackexchange.com/questions/14270/ Kẻ
đơn giản hóa

3

Cố gắng chỉ sử dụng -Ccho đường dẫn sẽ ngăn nén với các đường dẫn hoàn chỉnh:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

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ó

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.