Привет.
В свободное время потихоньку пилю свои велосипеды для gentoo. Дошёл черёд equery, а в частности equery size.
[cppmm@damned mportage]$ equery s bash -b
* app-shells/bash-5.1_p16-r2
Total files : 45
Total size : 2889615
Проверяем. Для проверки я смотрю в CONTENTS, достаю оттуда только то, что является по типу obj и суммирую:
foreach my $line (<$contents_handle>) {
my @line = split / /, $line;
$files++;
if ($line[0] eq 'obj') {
my $file_size = (stat $line[1])[7];
$size = $size + $file_size if defined($file_size);
}
}
for size in $(ls -l $(grep -E '^obj' CONTENTS | awk '{print $2}') | awk '{print $5}') ; do let "FSIZE = FSIZE + $size" ; echo $FSIZE ; done ; unset FSIZE
Иду смотреть в код gentoolkit
seen = set()
size = n_files = n_uncounted = 0
for path in self.parsed_contents(prefix_root=True):
try:
st = os.lstat(_unicode_encode(path, encoding=_encodings["fs"]))
except OSError:
continue
# Remove hardlinks by checking for duplicate inodes. Bug #301026.
file_inode = st.st_ino
if file_inode in seen:
continue
seen.add(file_inode)
try:
size += st.st_size
n_files += 1
except OSError:
n_uncounted += 1
return (size, n_files, n_uncounted)
За исключением дополнительной проверки на хардлинки(в bash'е, взятом для примера, хардлинков нет), всё выглядит так же, как у меня. Но почему тогда итоговая сумма различается? Где я просчитался и откуда equery берёт ещё почти три сотни килобайт?
Содержание CONTENTS:
dir /usr
dir /usr/share
dir /usr/share/info
sym /usr/share/info/bashref.info.bz2 -> bash.info.bz2 1673668093
obj /usr/share/info/bash.info.bz2 393a14a5ef4f7a9fd1f972fe722e1b4c 1673668089
dir /usr/share/man
dir /usr/share/man/man1
obj /usr/share/man/man1/rbash.1.bz2 7d8fa9646b44685ce5b435251a755669 1673668091
obj /usr/share/man/man1/bash.1.bz2 89a2fe46e383d7f6bf247d8f8dfeb2d0 1673668089
obj /usr/share/man/man1/bashbug.1.bz2 9d12dc1958d8e640264182b801e24316 1673668089
obj /usr/share/man/man1/bash_builtins.1.bz2 e84268f4670be0fa8ed185a43ca1d233 1673668091
dir /usr/share/doc
dir /usr/share/doc/bash-5.1_p16-r2
obj /usr/share/doc/bash-5.1_p16-r2/CHANGES.bz2 5c43139aae5703fe86c394c3e45b66ea 1673668090
obj /usr/share/doc/bash-5.1_p16-r2/POSIX.bz2 e641b4188c5824c1441b97b594da69ac 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/NEWS.bz2 6c47111c691f28fdf8822ae2c16b7536 1673668090
obj /usr/share/doc/bash-5.1_p16-r2/RBASH.bz2 ed3e9e7fe6ce0e83d05cfb994e0cecdb 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/INTRO.bz2 0adb1e98d3ad2a3a012d696ea17e5547 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/COMPAT.bz2 7029427047217c824828bf2fa4c3816f 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/AUTHORS.bz2 65f88febe33195919919139655121a7f 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/FAQ.bz2 c54d1bdf18849c74a94d5dcebce4e623 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/README.bz2 a9ebdee593521b64c96fad5bb7b3a3c3 1673668089
dir /usr/share/doc/bash-5.1_p16-r2/html
obj /usr/share/doc/bash-5.1_p16-r2/html/bashref.html b0bf8f6881f88d1fd2aff973ae1975af 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/html/bash.html c9336f41ad159aa7d606a1999d75e020 1673668089
obj /usr/share/doc/bash-5.1_p16-r2/ChangeLog.bz2 83aeece17d29263f5ff312228c1e71ca 1673668091
dir /usr/share/locale
dir /usr/share/locale/ru
dir /usr/share/locale/ru/LC_MESSAGES
obj /usr/share/locale/ru/LC_MESSAGES/bash.mo 39c19d7b6487b5108893f42bf2a74638 1673668089
dir /usr/bin
obj /usr/bin/bashbug 53b7bde997005b1c10aa3d182111b397 1673668089
dir /etc
dir /etc/bash
obj /etc/bash/bash_logout 229ccc2980a94877f2e87f957e9da7bf 1673668090
obj /etc/bash/bashrc 4ba9eb2e8e8e5a503477a6445a11200c 1673668091
dir /etc/bash/bashrc.d
obj /etc/bash/bashrc.d/.keep_app-shells_bash-0 d41d8cd98f00b204e9800998ecf8427e 1673668090
dir /etc/skel
obj /etc/skel/.bash_logout 7d8a8ef90c1818a0cd66808ac2740638 1673668091
obj /etc/skel/.bash_profile d3322040528c46743ea8e4b0b9a186bc 1673668091
obj /etc/skel/.bashrc d210b9cd7fc07420736480f2062d7d7f 1673668091
dir /bin
sym /bin/rbash -> bash 1673668090
obj /bin/bash 7e6a211d8a6e4a14b8c8ffbc49a38fcd 1673668093