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.

Benubird
sumber

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.

grebneke
sumber
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.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
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.

tuk0z
sumber
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
...
Abdel Karim Mateos Sanchez
sumber
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}'
okigan
sumber