Tôi có dòng rất đơn giản này trong một tập lệnh bash thực thi thành công (nghĩa là tạo _data.tar
tệp), ngoại trừ việc nó không loại trừ các thư mục con mà nó được thông báo loại trừ thông qua --exclude
tùy chọn:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
Thay vào đó, nó tạo ra một _data.tar
tệp chứa mọi thứ bên dưới / dữ liệu, bao gồm các tệp trong thư mục con tôi muốn loại trừ.
Bất cứ ý tưởng tại sao? và làm thế nào để khắc phục điều này?
Cập nhật Tôi đã triển khai các quan sát của mình dựa trên liên kết được cung cấp trong câu trả lời đầu tiên bên dưới (thư mục cấp cao nhất trước, không có khoảng trắng sau khi loại trừ cuối cùng):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Nhưng điều đó không giúp được gì. Tất cả các thư mục con "loại trừ" đều có trong _data.tar
tệp kết quả .
Điều này thật khó hiểu. Cho dù đây là lỗi trong tar hiện tại (GNU tar 1.23, trên CentOS 6.2, Linux 2.6.32) hay "độ nhạy cực cao" của tar đối với khoảng trắng và các lỗi chính tả dễ bỏ sót khác, tôi coi đây là lỗi. Để bây giờ.
Điều này thật kinh khủng : Tôi đã thử cái nhìn sâu sắc được đề xuất bên dưới (không có dấu vết /*
) và nó vẫn không hoạt động trong kịch bản sản xuất:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
Tôi không thể thấy bất kỳ sự khác biệt nào giữa những gì tôi đã thử và những gì @Richard Perrin đã thử, ngoại trừ dấu ngoặc kép và 2 khoảng trắng thay vì 1. Tôi sẽ thử điều này (phải đợi kịch bản hàng đêm chạy khi thư mục được sao lưu lên là rất lớn) và báo cáo lại.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Tôi bắt đầu nghĩ rằng tất cả những tar --exclude
sự nhạy cảm này không phải là tar mà là một cái gì đó trong môi trường của tôi, nhưng sau đó nó có thể là gì?
Nó đã làm việc! Biến thể cuối cùng đã thử (không có dấu ngoặc đơn và dấu cách đơn thay vì không gian kép giữa các --exclude
) được thử nghiệm. Lạ nhưng chấp nhận.
Không thể tin được! Nó chỉ ra rằng một phiên bản cũ hơn tar
(1.15.1) sẽ chỉ loại trừ nếu thư mục cấp cao nhất là cuối cùng trên dòng lệnh. Điều này hoàn toàn ngược lại với cách yêu cầu phiên bản 1.23. FYI.