Як я можу знайти файли, більші / менші, ніж x байти?


237

Як в терміналі я можу знайти файли, які є більшими або меншими за х байт?

Я думаю, я можу зробити щось на кшталт

find . -exec ls -l {} \;

а потім передайте результат awkдля фільтра за розміром файлу. Але чи не повинен бути простіший спосіб, ніж цей?

Відповіді:


376

Використання:

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: Від людини знайдіть на початку розділу "Тести": "Числові аргументи можна вказати як + n для більш ніж n, -n для менше n, n точно n".
Денніс Вільямсон

4
Сторінка чоловіка згадує її вгорі і описує, що + і - можуть застосовуватися до всіх комутаторів, які приймають числові ('n') аргументи, включаючи, що означають + і -. (Шукайте ТЕСТИ на сторінці чоловіка, щоб знайти початок розділу, де це описано)
Slartibartfast

1
@Денніс Вільямсон: дивно, + та - працює в OS X, але на цій сторінці немає розділу "ТЕСТИ". Насправді йому не вистачає великого шматка порівняно з вашим посиланням, у ньому відсутні тести, дії, оператори, серед інших.
стельовий кіт

1
Здається, у GNU-версії довідкової сторінки є розділ "Тести", але у BSD-версії немає. linuxmanpages.com/man1/find.1.php
Jay

8
Я щойно з’ясував, що сторінки BSD man описують +/- річ. Її шлях в кінці розділу "Праймеріз". - Усі праймери, які приймають числовий аргумент, дозволяють передувати цифрі знаком плюс ("+") або знаком мінус ("-"). Попередній знак плюс означає «більше n», попередній знак мінус означає «менше n» і не означає «точно n»
Jay

7

Я думаю, що findможе бути корисним самостійно, не використовуючи AWK. Наприклад,

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


Яка різниця між передачею на 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, який показує фактичний розмір декомпресії.
Кріс Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.