Есть ли простой способ найти все разреженные файлы в моей системе или в определенном дереве каталогов?
Если это уместно, я использую zsh
в Ubuntu 12.04, хотя более общий Unix-y ответ для bash / sh, например, был бы в порядке.
Изменить : чтобы уточнить, я ищу для поиска разреженных файлов, а не проверять статус разреженности одного.
filesystems
files
Эндрю Ферье
источник
источник
Ответы:
В системах (и файловых системах), поддерживающих
SEEK_HOLE
lseek
флаг (как, например, ваша Ubuntu 12.04 на ext4) и предполагающих значение дляSEEK_HOLE
4, как в Linux:Этот синтаксис оболочки - POSIX. Непереносимые вещи в нем есть
perl
и тоSEEK_HOLE
.lseek(SEEK_HOLE)
ищет начало первого отверстия в файле или конец файла, если отверстие не найдено. Выше мы знаем, что файл не редкий, когда онlseek(SEEK_HOLE)
переносит нас в конец файла (в то же место, что иlseek(SEEK_END)
).Если вы хотите перечислить разреженные файлы:
GNU
find
(начиная с версии 4.3.3) должен-printf %S
сообщать о редкости файла. Он использует тот же подход, что и ответ frostschutz, в том смысле, что он принимает соотношение использования диска и размера файла, поэтому не гарантируется, что он сообщает обо всех разреженных файлах (например, когда есть сжатие на уровне файловой системы или когда пространство, сэкономленное дырами, не компенсировать накладные расходы на инфраструктуру файловой системы или большие расширенные атрибуты), но будет работать в системах, которые не имеют,SEEK_HOLE
или в файловых системах, гдеSEEK_HOLE
это не реализовано. Здесь с инструментами GNU:(обратите внимание, что более ранняя версия этого ответа не работала должным образом, когда
find
выражалась редкость, как, например, 3.2e-05. Спасибо ответу @ flashydave за то, что он привлек мое внимание)источник
find
следует также полностью исключить 0-байтовые файлы?find -printf '%S'
! :-)tr
команду сxargs -r0 rm -f
Файл обычно разрежен, когда количество выделенных блоков меньше размера файла (здесь используется GNU,
stat
как в Ubuntu, но следует помнить, что другие системы могут иметь несовместимые реализацииstat
).Вариант с
find
: (украдено у Стефана)Вместо этого вы обычно помещаете это в сценарий оболочки, а затем исполняете сценарий оболочки.
источник
SEEK_HOLE
Это так же проблематично, поскольку не поддерживается многими платформами / файловыми системами. В Linux вы также можете использоватьFIEMAP
/FIBMAP
, но,FIBMAP
в частности, это ужасно медленно ... просто не кажется, что это хороший способ.for file in *
илиfind
. Если вы можете протестировать один файл, вы можете протестировать все файлы ... хотя вы должны исключить каталоги с помощью этого метода.Ответ Stephane Chazelas выше не учитывает тот факт, что некоторые разреженные файлы с параметром find% S сообщают об этом соотношении в виде чисел с плавающей запятой, таких как
Они могут быть найдены в дополнение к
источник
Короткий сценарий, который я написал, пытаясь выяснить, каковы расположения дырок в файле:
Это печатает такие вещи, как:
источник