Bagaimana cara mendapatkan ukuran folder dengan mengabaikan tautan keras?


18

Saya menggunakan rsnapshot untuk cadangan, yang menghasilkan serangkaian folder yang berisi file dengan nama yang sama. Beberapa file sulit ditautkan, sementara yang lain terpisah. Misalnya, hourly.1/file1dan hourly.2/file1mungkin sulit ditautkan ke file yang sama, sementara hourly.1/file2dan hourly.2/file2sepenuhnya merupakan file yang terpisah.

Saya ingin menemukan jumlah ruang yang digunakan oleh folder hourly.2 mengabaikan file yang merupakan tautan keras ke file hourly.1. Jadi dalam contoh di atas, saya ingin mendapatkan ukuran file2, tetapi abaikan file1.

Saya menggunakan bash di linux, dan saya ingin melakukan ini dari baris perintah sesederhana mungkin, jadi tidak ada solusi grafis atau hanya OS-satunya yang lain tolong.

Jawaban:


8

Ukuran total dalam byte dari semua file hourly.2yang hanya memiliki satu tautan:

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

Dari findhalaman manual:

   -links n
          File has n links.

Untuk mendapatkan jumlah dalam kilobyte dan bukan byte, gunakan -printf "%k\n"

Untuk membuat daftar file dengan jumlah tautan yang berbeda, main-main dengan find -links +1(lebih dari satu tautan), find -links -5(kurang dari lima tautan) dan sebagainya.


1
Jika ada file yang memiliki tautan keras ke file hourly2, perintah Anda akan memproses jawaban yang salah.
cuonglm

@ Gnouc - Yah ya - itu tergantung pada bagaimana file berakhir hourly.2. Jika mereka disalin di sana, mereka tidak akan memiliki tautan tambahan dan perintah saya akan berfungsi. Jika mereka terkait erat, jelas itu akan gagal. Saya berasumsi file cadangan baru disalin.
grebneke

12

Jika Anda secara khusus menginginkan ukuran file yang ada di bawah hourly.2tetapi tidak di bawah hourly.1, Anda dapat memperolehnya sedikit secara tidak langsung du. Jika dumemproses file yang sama lebih dari satu kali (bahkan di bawah nama yang berbeda, yaitu tautan keras), itu hanya menghitung file pertama kali. Jadi yang du hourly.1 hourly.2dilaporkan hourly.2adalah ukuran yang Anda cari. Jadi:

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

(Bekerja pada sistem POSIX dan sebagian besar varian Unix lainnya. Diasumsikan bahwa nama direktori hourly.1tidak mengandung baris baru.)


Untuk beberapa alasan aneh du tidak selalu memperhatikan file yang di-hardlink pada RHEL5 - jika saya melakukan 'du -sh dir / sub dir' output untuk dir adalah sama seperti jika saya hanya mengatakan 'du -sh dir' - tidak termasuk ukuran dari 'dir / sub'.
Andreas Krey

9

Seperti yang dikatakan @Gilles, karena duhanya menghitung hardlink pertama yang menunjuk ke inode yang sama yang dihadapinya, Anda dapat memberikannya direktori secara berturut-turut:

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

Jika ada file dalam 'per jam.2' yang mereferensikan inode (alias file "asli") yang telah dirujuk dalam 'per jam.1', tidak akan dihitung.


2
Menurut du --help , opsi --max-depth = 0 sama dengan -s , jadi di atas dapat disingkat sebagai:$ du -hcs dirA dirB
aliasvel

2

Lebih simpel

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

Contoh

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
...

Terima kasih, Abdel. Ini harus menjadi jawaban yang diterima.
TiberiusKirk

Luar biasa. Ini bekerja untuk saya pada percobaan pertama di macOS 10.15 saya. Terima kasih.
dimitarvp

1

Membangun Awesomely BusyBox finddatang tanpa -printfdukungan. Berikut ini modifikasi jawaban @ grebneke :

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.