2

Когда я выпускаю

find / \( -type f -size +10M \) -and \( -type f -size -1G \)

Я не получаю никаких результатов. Тем не менее, когда я печатаю

find / \( -type f -size +10M \) -and \( -type f -size -1000M \)

команда возвращает количество имен файлов.

В чем дело? Разве я не могу использовать разные единицы измерения по обе стороны от оператора -and ?

1 ответ1

1

найти и размер

Единицей размера по умолчанию для команды find является блок из 512 байтов.

Смущает то, что когда вы указываете размер файла в таких единицах, как КБ, МБ или ГБ, команда find округляет размер файла и использует этот показатель перед проверкой на соответствие предикату size .

Например, когда предикат размера выражается в ГБ (-size -1G), размер файла 900 МБ округляется до 1 ГБ - что составляет не менее 1 ГБ, поэтому такой файл не будет возвращен с помощью -size -1G , Чтобы найти файлы размером менее 1 ГБ, размер должен быть указан в меньших единицах:

find -size -1024M

Посмотрите этот ответ Стефана Шазеласа на связанный вопрос о Unix и Linux.

find . -size -1M покажет только файл размером менее 1M, то есть 0M. Да, я знаю, это сбивает с толку.

Официальная документация

На странице руководства POSIX для find предикат size задокументирован следующим образом (выделено мной):

- размер n [c]

Первичное значение должно оцениваться как true, если размер файла в байтах, разделенный на 512 и округленный до следующего целого числа, равен n . Если за n следует символ «c», размер должен быть в байтах.

Страница man для GNU find предупреждает, что

Префиксы + и - означают больше и меньше, чем обычно, но имейте в виду, что размер округляется до следующей единицы (поэтому однобайтовый файл не соответствует -size -1M).


Использование -and предиката

Наконец, использование предиката -and не имеет ничего общего с тем, как find интерпретирует размеры файлов. Нет проблем с использованием разных единиц измерения по обе стороны от -and или -or .

Между прочим, -and является значением по умолчанию и неявно используется для объединения того, как несколько предикатов оцениваются в выражении find ; -and на самом деле является расширение GNU , чтобы find так опуская это лучше для портативности. Кроме того, оставив его, вы можете значительно упростить выражение find (также нет необходимости в скобках):

find / -type f -size +10M -size -1000M

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .