Как получить размер папки без учета жестких ссылок?


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. Если они скопированы туда, у них не будет лишних ссылок, и моя команда будет работать. Если они жестко связаны, очевидно, что это не удастся. Я предполагаю, что новые резервные копии копируются.
Гребнеке

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подсчитывает только первые из всех жестких ссылок, указывающих на тот же инод, с которым он сталкивается, вы можете дать ему каталоги подряд:

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

Спасибо, Абдель. Это должен быть принятый ответ.
TiberiusKirk

Потрясающие. Это сработало для меня с первой попытки на моем MacOS 10.15. Спасибо.
dimitarvp

1

Внушительные сборки 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.