Как я могу найти файлы, которые больше / меньше х байтов?

237

В терминале, как я могу найти файлы, которые больше или меньше х байтов?

Я полагаю, я могу сделать что-то вроде

find . -exec ls -l {} \;

а затем направить результат awkдля фильтрации по размеру файла. Но не должен ли быть более легкий путь, чем этот?

потолочный кот
источник

Ответы:

377

Использование:

find . -type f -size +4096c

найти файлы размером более 4096 байт.

А также :

find . -type f -size -4096c

найти файлы размером менее 4096 байт.

Обратите внимание на разницу + и - после переключения размера.

-sizeПереключатель пояснил:

-size n[cwbkMG]

    File uses n units of space. The following suffixes can be used:

    `b'    for 512-byte blocks (this is the default if no suffix  is
                                used)

    `c'    for bytes

    `w'    for two-byte words

    `k'    for Kilobytes       (units of 1024 bytes)

    `M'    for Megabytes    (units of 1048576 bytes)

    `G'    for Gigabytes (units of 1073741824 bytes)

    The size does not count indirect blocks, but it does count
    blocks in sparse files that are not actually allocated. Bear in
    mind that the `%k' and `%b' format specifiers of -printf handle
    sparse files differently. The `b' suffix always denotes
    512-byte blocks and never 1 Kilobyte blocks, which is different
    to the behaviour of -ls.
Джон Т
источник
11
@Jay: От man найдите в начале раздела «Тесты»: «Числовые аргументы могут быть указаны как + n для значений больше n, -n для значений меньше n, n для точно n».
Деннис Уильямсон
4
Справочная страница упоминает ее в верхней части и описывает, что + и - могут применяться ко всем переключателям, которые принимают числовые ('n') аргументы, включая то, что + и - означают. (Ищите ИСПЫТАНИЯ на странице руководства, чтобы найти начало раздела, где это описано)
Slartibartfast
1
@Dennis Williamson: странно, + и - работают в OS X, но на странице руководства нет раздела TESTS. На самом деле, он пропускает большой кусок по сравнению с вашей ссылкой, он пропускает ТЕСТЫ, ДЕЙСТВИЯ, ОПЕРАТОРЫ и другие.
потолочный кот
1
Похоже, что версия справочной страницы GNU содержит раздел «Тесты», а версия BSD - нет. linuxmanpages.com/man1/find.1.php
Джей
8
Я только что узнал, что справочные страницы BSD описывают вещь +/-. Его путь в конце раздела «Праймериз». - Все основные цвета, которые принимают числовой аргумент, позволяют номеру предшествовать знаку плюс («+») или минус («-»). Предыдущий знак плюс означает «больше, чем n», предыдущий знак минус означает «меньше, чем n», и ни один из них не означает «ровно n»
Jay
7

Я думаю, что findможет быть полезным в одиночку, без обмана. Например,

find ~ -type f -size +2k  -exec ls -sh {} \;

Тильда указывает, где вы хотите начать поиск, и в результате должны отображаться только файлы размером более 2 килобайт.

Чтобы сделать это причудливым, вы можете использовать -execопцию для выполнения другой команды, которая должна перечислить эти каталоги с их размерами.

Для получения дополнительной информации прочитайте справочную страницу дляfind .

Шивон
источник
4

AWK действительно довольно прост для такого рода вещей. Вот несколько вещей, которые вы можете сделать с ним в отношении проверки размера файла, как вы и просили:

Список файлов размером более 200 байт:

ls -l | awk '{if ($5 > 200) print $8}'

Выведите список файлов размером менее 200 байт и запишите список в файл:

ls -l | awk '{if ($5 < 200) print $8}' | tee -a filelog

Перечислите файлы размером 0 байт, запишите список в файл и удалите пустые файлы:

ls -l | awk '{if ($5 == 0) print $8}' | tee -a deletelog | xargs rm
MaQleod
источник
В чем разница между конвейерной передачей teeи простым перенаправлением в файл, например ls -l > filelog(или ls -l >> filelog)?
ОмарОтман
3

Больше чем 2000 байтов:

du -a . | awk '$1*512 > 2000 {print $2}'

Менее 2000 байтов:

du -a . | awk '$1*512 < 2000 {print $2} '
сойка
источник
Это плохо, так как du дает место на занятом диске. Это не то же самое, что размер файла. Например, если у вас сжатая файловая система (btrfs / zfs), du выдаст вам результат, отличный от ls, который показывает фактический распакованный размер.
Крис Скотт