Tôi có một thư mục chứa hơn 400 GiB dữ liệu trong đó. Tôi muốn kiểm tra xem tất cả các tập tin có thể được đọc mà không có lỗi, vì vậy một cách đơn giản mà tôi nghĩ là đưa tar
nó vào /dev/null
. Nhưng thay vào đó tôi thấy hành vi sau:
$ time tar cf /dev/null .
real 0m4.387s
user 0m3.462s
sys 0m0.185s
$ time tar cf - . > /dev/null
real 0m3.130s
user 0m3.091s
sys 0m0.035s
$ time tar cf - . | cat > /dev/null
^C
real 10m32.985s
user 0m1.942s
sys 0m33.764s
Lệnh thứ ba ở trên đã bị buộc dừng lại bởi Ctrl+ Csau khi đã chạy khá lâu. Hơn nữa, trong khi hai lệnh đầu tiên đang hoạt động, chỉ báo hoạt động của thiết bị lưu trữ chứa .
gần như luôn ở chế độ chờ. Với lệnh thứ ba, đèn báo liên tục sáng lên, nghĩa là sự bận rộn cực độ.
Vì vậy, có vẻ như, khi tar
có thể phát hiện ra rằng tệp đầu ra của nó là /dev/null
, tức là khi /dev/null
được mở trực tiếp để có tệp xử lý tar
ghi vào, phần thân tệp xuất hiện bị bỏ qua. (Thêm v
tùy chọn để tar
in tất cả các tệp trong thư mục có tar
màu đỏ.)
Vì vậy, tôi tự hỏi, tại sao điều này là như vậy? Đây có phải là một loại tối ưu hóa? Nếu có, thì tại sao tar
thậm chí muốn thực hiện một tối ưu hóa đáng ngờ cho một trường hợp đặc biệt như vậy?
Tôi đang sử dụng GNU tar 1.26 với glibc 2.27 trên Linux 4.14.105 amd64.
pv
: tar -cf - | pv >/dev/null
. Điều đó khắc phục vấn đề và cung cấp cho bạn thông tin tiến trình (các pv
tùy chọn khác nhau )
gtar -cf /dev/zero ...
để có được những gì bạn thích.
find . -type f -exec shasum -a256 -b '{}' +
. Nó không chỉ thực sự đọc và kiểm tra tất cả dữ liệu, mà nếu bạn lưu trữ đầu ra, bạn có thể chạy lại nó sau để kiểm tra xem nội dung của các tệp đã thay đổi.