Làm thế nào để có được kích thước thư mục bỏ qua các liên kết cứng?


16

Tôi sử dụng rsnapshot để sao lưu, tạo ra một loạt các thư mục chứa các tệp cùng tên. Một số tệp được liên kết cứng, trong khi các tệp khác là riêng biệt. Chẳng hạn, hourly.1/file1hourly.2/file1có thể được liên kết cứng với cùng một tệp, trong khi hourly.1/file2hourly.2/file2là các tệp hoàn toàn riêng biệt.

Tôi muốn tìm dung lượng được sử dụng bởi thư mục hourly.2 bỏ qua mọi tệp có liên kết cứng đến tệp trong hourly.1. Vì vậy, trong ví dụ trên, tôi muốn lấy kích thước của tệp2, nhưng bỏ qua tệp1.

Tôi đang sử dụng bash trên linux và tôi muốn làm điều này từ dòng lệnh một cách đơn giản nhất có thể, vì vậy không có giải pháp đồ họa lớn hoặc chỉ dành cho hệ điều hành nào khác.

Câu trả lời:


7

Tổng kích thước tính theo byte của tất cả các tệp hourly.2chỉ có một liên kết:

$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'

Từ findtrang con người:

   -links n
          File has n links.

Để lấy tổng bằng kilobyte thay vì byte, hãy sử dụng -printf "%k\n"

Để liệt kê các tệp có số lượng liên kết khác nhau, hãy chơi xung quanh find -links +1(nhiều hơn một liên kết), find -links -5(ít hơn năm liên kết), v.v.


1
Nếu một tệp có liên kết cứng đến tệp trong hourly2, lệnh của bạn sẽ xử lý câu trả lời sai.
cuonglm

@Gnouc - Vâng vâng - nó phụ thuộc vào cách các tập tin kết thúc hourly.2. Nếu chúng được sao chép ở đó, chúng sẽ không có thêm liên kết và lệnh của tôi sẽ hoạt động. Nếu chúng được liên kết cứng, rõ ràng nó sẽ thất bại. Tôi giả sử các tập tin sao lưu mới được sao chép.
grebneke

11

Nếu bạn đặc biệt muốn kích thước của các tệp hiện diện bên dưới hourly.2nhưng không phải bên dưới hourly.1, bạn có thể lấy nó một cách gián tiếp du. Nếu duxử lý cùng một tệp nhiều lần (ngay cả dưới các tên khác nhau, tức là liên kết cứng), thì nó chỉ đếm tệp lần đầu tiên. Vì vậy, những gì du hourly.1 hourly.2báo cáo cho hourly.2là kích thước bạn đang tìm kiếm. Như vậy:

du -ks hourly.1 hourly.2 | sed -n '2s/[^0-9]*//p'

(Hoạt động trên mọi hệ thống POSIX và hầu hết các biến thể Unix khác. Giả sử rằng tên thư mục hourly.1không chứa bất kỳ dòng mới nào.)


Vì một số lý do kỳ lạ, du không phải lúc nào cũng chú ý đến các tệp được liên kết cứng trên RHEL5 - nếu tôi thực hiện 'du -sh dir / sub dir' thì đầu ra cho dir giống như khi tôi chỉ nói 'du -sh dir' - không loại trừ kích thước của 'dir / phụ'.
Andreas Krey

8

Như @Gilles nói, vì duchỉ đếm lần đầu tiên trong số tất cả các liên kết cứng trỏ đến cùng một nút mà nó gặp phải, bạn có thể cung cấp cho nó các thư mục liên tiếp:

$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
 1G /hourly.2
30G total

Tức là bất kỳ tệp nào trong 'hàng giờ.2' tham chiếu một nút inode (còn gọi là tệp "thực") đã được tham chiếu trong 'hàng giờ.1', sẽ không được tính.


2
Theo du --help , tùy chọn $ du -hcs dirA dirB
--max


1

Đơn giản hơn

du -hc --max-depth=1 path/

Thí dụ

9.4G    daily/users/rockspa/home/daily.21
3.6G    daily/users/rockspa/home/daily.30
4.2G    daily/users/rockspa/home/daily.11
1.1G    daily/users/rockspa/home/daily.4
4.2G    daily/users/rockspa/home/daily.9
3.0G    daily/users/rockspa/home/daily.25
3.5G    daily/users/rockspa/home/daily.20
4.2G    daily/users/rockspa/home/daily.13
913M    daily/users/rockspa/home/daily.5
2.8G    daily/users/rockspa/home/daily.26
1.4G    daily/users/rockspa/home/daily.1
2.6G    daily/users/rockspa/home/daily.28
4.2G    daily/users/rockspa/home/daily.15
3.8G    daily/users/rockspa/home/daily.19
327M    daily/users/rockspa/home/daily.8
4.2G    daily/users/rockspa/home/daily.17
3.1G    daily/users/rockspa/home/daily.23
...

Cảm ơn Abdel. Đây phải là câu trả lời được chấp nhận.
TiberiusKirk
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.