Як отримати розмір папки, ігноруючи жорсткі посилання?


17

Я використовую rsnapshot для створення резервних копій, що створює серію папок, що містять файли з однойменною назвою. Деякі файли жорстко пов’язані, інші - окремо. Наприклад, hourly.1/file1і hourly.2/file1може бути важко пов'язані з тим же файлом, в той час як hourly.1/file2і hourly.2/file2абсолютно окремі файли.

Я хочу знайти простір, який використовує папка, hourly.2 ігноруючи будь-які файли, в яких є жорсткі посилання на файли hourly.1. Отже, у наведеному вище прикладі я хотів би отримати розмір file2, але ігнорувати file1.

Я використовую bash на Linux, і я хочу це зробити з командного рядка якомога простіше, тому будь-яких великих графічних чи інших ОС, які не стосуються ОС, будь ласка.

Відповіді:


7

Загальний розмір у байтах усіх файлів, у hourly.2яких є лише одне посилання:

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

З findman-сторінки:

   -links n
          File has n links.

Щоб отримати суму в кілобайтах замість байтів, використовуйте -printf "%k\n"

Щоб перелічити файли з різним числом посилань, пограйте разом із find -links +1(більш ніж одне посилання), find -links -5(менше п’яти посилань) тощо.


1
Якщо файл якийсь, де є жорстке посилання на файл hourly2, ваша команда обробляє неправильну відповідь.
cuonglm

@Gnouc - Ну так - це залежить від того, як закінчуються файли hourly.2. Якщо вони будуть скопійовані туди, вони не матимуть зайвих посилань, і моя команда працюватиме. Якщо вони жорстко пов'язані, очевидно, це не вдасться. Я припускаю, що копіюються нові резервні файли.
grebneke

11

Якщо ви конкретно хочете, щоб розмір файлів, що знаходяться в, hourly.2але не під ним hourly.1, ви можете отримати його трохи побічно du. Якщо один і duтой же файл обробляється декілька разів (навіть під різними іменами, тобто жорсткими посиланнями), він підраховує файл лише перший раз. Тож, що du hourly.1 hourly.2звітує, hourly.2- це розмір, який ви шукаєте. Таким чином:

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

(Працює в будь-якій системі POSIX та в більшості інших варіантів Unix. Передбачається, що ім'я каталогу hourly.1не містить жодної нової рядки.)


З якоїсь дивної причини du не завжди помічає жорсткі посилання файлів на RHEL5 - якщо я роблю 'du -sh dir / sub dir', вихід для dir такий же, як якщо б я щойно сказав «du-sh dir» - не виключаючи розмір від "dir / sub".
Андреас Крей

9

Як говорить @Gilles, оскільки duналічує лише перше з усіх жорстких посилань, що вказують на той самий inode, з яким він стикається, ви можете давати йому каталоги підряд:

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

Тобто будь-який файл у "hourly.2", на який посилається inode (він же "реальний" файл), на який вже посилається "hourly.1", не зараховується.


2
Відповідно до du --help , варіант - max-глибина = 0 еквівалентний -s , тому вище може бути скорочено як:$ du -hcs dirA dirB
akavel

2

Більш просто

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

Приклад

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

Дякую Абдел. Це має бути прийнятою відповіддю.
Тіберій

Дивовижно. Це працювало для мене під час першої спроби на моєму macOS 10.15. Дякую.
dimitarvp

1

Awesomely BusyBox є findбез -printfпідтримки. Ось модифікація відповіді @ grebneke :

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.