Використання ls для переліку каталогів та їх загальних розмірів


827

Чи можна за допомогою lsUnix перерахувати загальний розмір підкаталогу та весь його вміст на відміну від звичайного, 4Kщо (я припускаю) - це лише сам файл каталогу?

total 12K
drwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

Після прочитання чоловічих сторінок я виходжу порожнім.


4
ви хочете використовувати замість du -s
гармати

21
В пошуках качок:alias ducks='du -cksh * | sort -hr | head -n 15'
Себі

Відповіді:


1549

Спробуйте щось на кшталт:

du -sh *

коротка версія:

du --summarize --human-readable *

Пояснення:

du: D isk U мудрець

-s: Відображення резюме для кожного вказаного файлу. (Рівнозначно -d 0)

-h: Вихід "для людини". Використовуйте одиничні суфікси: B yte, K ibibyte (KiB), M ebibyte (MiB), G ibibyte (GiB), T ebibyte (TiB) та P ebibyte (PiB). (BASE2)


55
Також -c (виробляти загальну суму) приємно.
meridius

50
du --max-глубина 1 показує лише розмір файлів / папок 1 глибоко в дереві, більше не захаращується і легко знайти великі папки всередині папки.
CousinCocaine

12
як включити приховані файли теж?
Закарія Бракса

5
@Zak in zsh ви можете використовувати *(D)зіставити приховані ( d ot) файли поряд із звичайними файлами. Під час використання bash ви можете скористатися * .[!.]*обома.
Себі

22
Отримати чітке уявлення про те, куди йде простір, du -sch * .[!.]* | sort -rhчудово (показати відсортований вихід) На mac do: brew install coreutilsand thendu -sch * .[!.]* | gsort -rh
Guig

319

du -sk * | sort -nбуде сортувати папки за розміром. Корисно, коли ви шукаєте очистити простір ..


11
Додайте | tail -rдо сортування за величиною спочатку.
Фрогз

68
sort -rnсортує речі у зворотному числовому порядку. sort -rn | head -n 10покажуть лише перші кілька найкращих, якщо це викликає інтерес.
AgileTillIDie

14
sort -rhбуде добре працювати з тим, du -cksh *як він сортує людсько-читабельні блоки.
Себі

@Sebi -h не є дійсним параметром для сортування на Mac, на жаль
anon58192932

@Sebi також -c не потрібно, du -ksh | sort -rnте саме, що du -cksh | sort -rn. Так само, як du -kshі те саме du -cksh.
hello_there_andy

108
du -sh * | sort -h

Це буде відображено у читаному для людини форматі.


6
Детальніше про sort -hтут: gnu.org/software/coreutils/manual / ... Це особливо там для сортування 103K, 102M, і 1.1Gт.д. Це повинно бути доступно на багатьох систем в даний час, але не всі.
Євгеній Сергєєв

duh -shm * | сортувати -n?
std''OrgnlDave

10
прекрасно працює, одне невелике доповнення du -sh * | sort -rh(-r для перерахування перших великих папок)
artm

Включити приховані файли / каталоги; du -sh $(ls -A) | sort -h
jmd_dk

55

Щоб перелічити найбільші каталоги з поточного каталогу у читаному для людини форматі:

du -sh * | sort -hr

Кращим способом обмежити кількість рядків може бути

du -sh * | sort -hr | head -n10

Де ви можете збільшити суфікс -nпрапора, щоб обмежити кількість перелічених рядків

Зразок:

[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M    Vendor
1.1M    composer.phar
488K    phpcs.phar
488K    phpcbf.phar
72K doc
16K nbproject
8.0K    composer.lock
4.0K    README.md

Це робить зручніше читати :)


27

Щоб відобразити його у ls -lhформаті, використовуйте:

(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'

Код Awk пояснив:

if($1 == "total") { // Set X when start of ls is detected
  X = 1 
} else if (!X) { // Until X is set, collect the sizes from `du`
  SIZES[$2] = $1
} else {
  // Replace the size on current current line (with alignment)
  sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); 
  print $0
}

Вибірка зразка:

drwxr-xr-x 2 root     root 4.0K    Feb 12 16:43 cgi-bin
drwxrws--- 6 root     www  20M     Feb 18 11:07 document_root
drwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 icons
drwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd

будь-яким способом сортувати цей вихід? Також для всіх, хто працює на Mac, це працює чудово, якщо ви видалите--color=no
anon58192932

@ anon58192932 Ви можете подати висновок sort --key=5,5hдля сортування "людських читаних одиниць" з п’ятої колонки
Sebi

повертає sort: stray character in field spec: invalid field specification 5,5h'`. Я справді ненавиджу macs інколи = \
anon58192932

@ anon58192932 Ви можете задати питання, що стосується mac, я впевнений, що хтось може допомогти. Це питання позначається як GNU / Linux
Sebi

2
чи є спосіб зберегти колір за допомогою цієї відповіді?
Пабло Кансеко

20

Команда, яку ви хочете, - 'du -sk' du = "використання диска"

Прапор -k дає вам вихід у кілобайтах, а не за замовчуванням дискових секторів (512-байтних блоків).

Прапор -s буде містити лише список речей у каталозі верхнього рівня (тобто поточний каталог за замовчуванням або каталог, вказаний у командному рядку). Як не дивно, що у цьому відношенні ду має протилежну поведінку ls. За замовчуванням du рекурсивно надасть вам використання диска кожного підкаталога. На відміну від цього, ls видаватиме лише файли списку у вказаному каталозі. (ls -R дає вам рекурсивну поведінку.)


Спробувавши це в кореневому каталозі, він все ще намагається перелічити підкаталоги, в результаті чого з’являється безліч повідомлень.
Нагев

14

Помістіть цю декларацію функції оболонки у свої сценарії ініціалізації оболонок:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

Я назвав це, dulsтому що він показує вихід із обох duі ls(у тому порядку):

$ duls
210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .

$ duls *
 36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING
8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL
 28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in
4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README
120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4
684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache
128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build
 60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log
 36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status
264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure
8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac
7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc
2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples
6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
 11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src

$ duls doc
7.0M    drwxr-xr-x  8 kk  staff  272 Jun 10 13:26 doc

$ duls [bM]*
 28K    -rw-r--r--  1 kk  staff  24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in
128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

Пояснення:

pasteУтиліта створює стовпці з вхідних даних в відповідності зі специфікацією , що ви даєте йому. Враховуючи два вхідні файли, він розміщує їх поруч із вкладкою як роздільник.

Ми даємо йому вихід у du -hs -- "$@" | cut -f1якості першого файлу (вхідний потік дійсно) та виведення у ls -ld -- "$@"якості другого файлу.

У функції "$@"буде оцінено список усіх аргументів командного рядка, кожен у подвійних лапках. Тому він зрозуміє глобальні символи та назви шляхів із пробілами тощо.

Подвійні мінуси ( --) сигналізують про закінчення параметрів командного рядка до duта ls. Без цього приказка duls -lзаплутає, duі будь-який варіант для duцього lsне мав би плутати ls(і параметри, які існують в обох утилітах, не можуть означати одне і те ж, і це було б досить безладно).

cutПісля того, як duпросто вирізає перший стовпець du -hsвиведення (розміри).

Я вирішив поставити duвихід ліворуч, інакше мені довелося б керувати хиткою правою колонкою (через різну довжину назв файлів).

Команда не прийме прапори командного рядка.

Це було перевірено bashі в, і в ksh93. З цим не вийде /bin/sh.


Це мило. Дозволи та розміри на одній лінії
Бен

7

Я завжди використовую du -sk( -kпрапор із розміром файлу в кілобайтах).


5
це має бути коментар, надаючи додаткову інформацію до більш правильної та краще поясненої прийнятої відповіді від @molf. Це не слід вважати відповіддю самостійно
code_monk


7

ncdu ncurses du

Ця дивовижна утиліта CLI дозволяє вам легко знаходити великі файли та каталоги в інтерактивному режимі.

Наприклад, із дерева добре відомого проекту ми робимо:

sudo apt-get install ncdu
ncdu

Результат:

введіть тут опис зображення

Потім я вводжу вниз і вправо на клавіатурі, щоб перейти в /driversпапку, і я бачу:

введіть тут опис зображення

ncdu обчислює розміри файлів рекурсивно лише один раз при запуску для всього дерева, тому це ефективно.

"Загальне використання диска" проти "Очевидного розміру" є аналогом du, і я пояснив це так: чому результат `du` часто настільки відрізняється від` du -b`

Домашня сторінка проекту: https://dev.yorhel.nl/ncdu

Пов’язані запитання:

Тестовано в Ubuntu 16.04.

ncdu неінтерактивне використання

Ще однією цікавою особливістю ncduє те, що ви можете спочатку скинути розміри у форматі JSON, а пізніше використовувати їх повторно.

Наприклад, для створення запуску файлу:

ncdu -o ncdu.json

а потім вивчити його інтерактивно:

ncdu -f ncdu.json

Це дуже корисно, якщо ви маєте справу з дуже великою і повільною файловою системою, як NFS.

Таким чином, ви можете спочатку експортувати лише один раз, що може зайняти години, а потім вивчити файли, закрити, ще раз дослідити тощо.

Формат виводу - просто JSON, тому його легко повторно використовувати з іншими програмами, наприклад:

ncdu -o -  | python -m json.tool | less

розкриває просту структуру даних дерев каталогів:

[
    1,
    0,
    {
        "progname": "ncdu",
        "progver": "1.12",
        "timestamp": 1562151680
    },
    [
        {
            "asize": 4096,
            "dev": 2065,
            "dsize": 4096,
            "ino": 9838037,
            "name": "/work/linux-kernel-module-cheat/submodules/linux"
        },
        {
            "asize": 1513,
            "dsize": 4096,
            "ino": 9856660,
            "name": "Kbuild"
        },
        [
            {
                "asize": 4096,
                "dsize": 4096,
                "ino": 10101519,
                "name": "net"
            },
            [
                {
                    "asize": 4096,
                    "dsize": 4096,
                    "ino": 11417591,
                    "name": "l2tp"
                },
                {
                    "asize": 48173,
                    "dsize": 49152,
                    "ino": 11418744,
                    "name": "l2tp_core.c"
                },

Тестовано в Ubuntu 18.04.


1
Дивовижний. Дякую, що поділились!
Френк Фу

Я згоден, ncdu - це шлях ... але чи знаєте ви, чи можна шукати файл JSON? Тобто отримати повний шлях певного файлу / папки.
FGV

1
@FGV Я не думаю, що ncdu може вивести це, одна з можливостей - зламати простий скрипт python, який розбирає JSON.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功


4

Це одне мені подобається

оновлення : Мені не сподобалось попереднє, оскільки воно не відображало файли в поточному каталозі, воно перераховувало лише каталоги.

Приклад виводу для /varubuntu:

sudo du -hDaxd1 /var | sort -h | tail -n10

4.0K    /var/lock
4.0K    /var/run
4.0K    /var/www
12K     /var/spool
3.7M    /var/backups
33M     /var/log
45M     /var/webmin
231M    /var/cache
1.4G    /var/lib
1.7G    /var

3

Все це чудові пропозиції, але я використовую:

du -ksh * | sort -n -r

-ksh переконує, що файли та папки перераховані у читаному для людини форматі та в мегабайтах, кілобайт тощо. Потім ви сортуєте їх чисельно та повертаєте сортування таким чином, щоб вони ставили на перший план більші.

Єдиним недоліком цієї команди є те, що комп'ютер не знає, що Гігабайт більший за Мегабайт, тому він буде сортувати лише за номерами, і ви часто знайдете такі списки:

120K
12M
4G

Тільки уважно подивіться на пристрій.

Ця команда також працює на Mac (тоді як sort -h, наприклад, не працює).


Якщо ви вилучите -hпрапор із duкоманди, ви вирізали цю сторону
Карлос Рікардо

Або ви можете використовувати -hзамість -nсортування також.
Себі

або просто трубу через
греп

3
du -S

ий є ще один корисний варіанти: -S, --separate-dirsкрасномовна ий не включати розмір каталогів - це зручно в деяких випадках.

Приклад 1 - показує лише розміри файлів у каталозі:

du -Sh  * 
3,1G    10/CR2
280M    10

Приклад 2 - показує розміри файлів та підкаталоги в каталозі:

du -h  * 
3,1G    10/CR2 
3,4G    10



2

просто попередження, якщо ви хочете порівняти розміри файлів. du дає різні результати залежно від файлової системи, розміру блоку, ....

Може статися, що розмір файлів відрізняється, наприклад, порівнюючи один і той же каталог на вашому локальному жорсткому диску та USB-накопичувачі. Я використовую наступний скрипт, включаючи ls, щоб підсумувати розмір каталогу. Результат у байтах враховує всі підкаталоги.

echo "[GetFileSize.sh] target directory: \"$1\""

iRetValue=0

uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
  iRetValue=-1
else
  echo "[GetFileSize.sh] computing size of files..."

  # use ls to compute total size of all files - skip directories as they may
  # show different sizes, depending on block size of target disk / file system
  uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
  uiLength=$(expr length "$uiTotalSize")
  if [ $uiLength -lt 1 ]; then
    uiTotalSize=0
  fi
  echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""

fi

exit "$iRetValue"

1

Для рекурсивного відображення файлів та розмірів підкаталогів поточного каталогу:

du -h .

Щоб відобразити інформацію однакового розміру, але без рекурсивного друку їхніх підкаталогів (що може бути величезним списком), просто скористайтеся параметром --max-width :

du -h --max-depth=1 .

1

Деякий час я використовував Nautilus (на робочому столі Gnome на RHEL 6.0), щоб видалити файли в домашній папці, а не використовувати rmкоманду в bash. В результаті загальний розмір, показаний

du -sh

не відповідав сумі використання диска кожного підкаталога, коли я використовував

du -sh *

Мені знадобилося певний час, щоб зрозуміти, що Nautilus надсилає видалені файли у свою папку Кошик, і ця папка не вказана в du -sh *команді. Отже, я просто хотів поділитися цим, на випадок, якщо хтось зіткнувся з тією ж проблемою.


1

Хм, найкращий спосіб використовувати цю команду:

du -h -x / | sort -hr >> /home/log_size.txt

Тоді ви зможете отримати папки всіх розмірів на всьому сервері. Легко допомогти вам знайти найбільші розміри.


1

Наступне легко запам'ятати

ls -ltrapR

вміст каталогу списку

-Я використовую довгий формат лістингу

-сортувати за часом модифікації, найновішим першим

-r, - зворотний поворот під час сортування

-a, - всі не ігноруйте записи, починаючи з.

-p, --indicator-style = косо додавання / показник до каталогів

-R, --рекурсивні підкаталоги списку рекурсивно

https://explainshell.com/explain?cmd=ls+-ltrapR


1

Якщо ви хочете більше контролювати те, sizeщо ви хочете перелічити каталоги, ви можете використовувати перемикач threshold( -t), як у:

$ du -ht 1000000000 | sort --reverse

du- disk usage
h - читабельний для людини формат
t - розмір порогу

Тут ми хочемо перерахувати всі каталоги розміром більше 1 Гб.

$ du -ht 1G | sort --reverse

Пояснення :

Одиниці, описані у вікі, наступні:

K, M, G, T, P, E, Z, Y (потужності 1024) або
KB, MB, GB, TB, PB, EB, ZB, YB (потужності 1000).


0

Я зіткнувся з проблемою, подібною до описаної Мартіном Уайльдом, у моєму випадку порівнюючи один і той же каталог на двох різних серверах після дзеркального відображення з rsync.

Замість використання сценарію я додав -bпрапор доdu який рахує розмір у байтах, і наскільки я можу визначити, усунув відмінності на двох серверах. Ви все одно можете використовувати -s -hдля отримання зрозумілого результату.


0

розмістіть у скрипті init на зразок .bashrc ... налаштуйте def за потребою.

duh() {
  # shows disk utilization for a path and depth level
  path="${1:-$PWD}"
  level="${2:-0}"
  du "$path" -h --max-depth="$level"
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.