Использование ls для перечисления каталогов и их общих размеров

Можно ли использовать ls в Unix для отображения общего размера подкаталога и всего его содержимого в отличие от обычного 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

После очистки страниц man я опустел.

Ответ 1

Попробуйте что-то вроде:

du -sh *

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

du --summarize --human-readable *

Объяснение:

du: D isk U sage

-s: отображение сводки для каждого указанного файла. (Эквивалентно -d 0)

-h: "Человекочитаемый" вывод. Используйте единичные суффиксы: B yte, K ибибайт (KiB), M ebibyte (MiB), G ibibyte (GiB), T ebibyte (TiB) и P ebibyte (PiB). (Base2)

Ответ 2

du -sk * | sort -n сортирует папки по размеру. Полезно при поиске пространства.

Ответ 3

du -sh * | sort -h

Это будет отображаться в формате для чтения.

Ответ 4

Перечислить крупнейшие каталоги из текущего каталога в формате для чтения:

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

Это удобнее читать:)

Ответ 5

Чтобы отобразить его в формате 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

Ответ 6

Команда, которую вы хотите, это "du -sk" du = "использование диска"

Флаг -k дает вам выход в килобайтах, а не по умолчанию для дисковых секторов (512-байтовые блоки).

Флаг -s будет отображать только список в каталоге верхнего уровня (т.е. текущий каталог по умолчанию или каталог, указанный в командной строке). Странно, что du имеет противоположное поведение ls в этом отношении. По умолчанию du рекурсивно даст вам использование диска для каждого подкаталога. Напротив, ls будет предоставлять файлы списка только в указанном каталоге. (ls -R дает рекурсивное поведение.)

Ответ 7

Поместите это объявление функции оболочки в свои сценарии инициализации оболочки:

function duls {
    paste <( du -hs -- "[email protected]" | cut -f1 ) <( ls -ld -- "[email protected]" )
}

Я назвал его 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 -- "[email protected]" | cut -f1 в качестве первого файла (входной поток действительно) и вывод ls -ld -- "[email protected]" в качестве второго файла.

В функции "[email protected]" будет оцениваться список всех аргументов командной строки, каждый в двойных кавычках. Поэтому он будет понимать символы подстановки и имена путей с пробелами и т.д.

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

cut после du просто вырезает первый столбец вывода du -hs (размеры).

Я решил поместить вывод du слева, иначе мне пришлось бы управлять шатком правым столбцом (из-за различной длины имен файлов).

Команда не будет принимать флаги командной строки.

Это было протестировано как в bash, так и в ksh93. Он не будет работать с /bin/sh.

Ответ 8

Я всегда использую du -sk (-k флаг, показывающий размер файла в килобайтах).

Ответ 9

du -h --max-depth=1 . | sort -n -r

Ответ 10

du -sch * в том же каталоге.

Ответ 11

Это один мне нравится

update: Мне не нравился предыдущий, потому что он не показывал файлы в текущем каталоге, это только перечисленные каталоги.

Пример вывода для /var на ubuntu:

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

Ответ 12

посмотрите на команду du для этого

Ответ 13

Это все замечательные предложения, но я использую это:

du -ksh * | sort -n -r

-ksh гарантирует, что файлы и папки перечислены в формате, удобном для человека, и в мегабайтах, килобайтах и ​​т.д. Затем вы сортируете их в цифровом виде и меняете сортировку, чтобы сначала ставить большие.

Единственным недостатком этой команды является то, что компьютер не знает, что Gigabyte больше, чем Megabyte, поэтому он будет сортировать только по номерам, и вы часто найдете такие списки:

120K
12M
4G

Просто будьте осторожны, чтобы посмотреть на устройство.

Эта команда также работает на Mac (тогда как sort -h не используется).

Ответ 14

du -S

du имеет еще одну полезную опцию: -S, --separate-dirs указание не включать размер подкаталогов - в некоторых случаях это удобно.

Пример 1 - показывает только размеры файлов в каталоге:

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

Пример 2 - показывает размеры файлов и подкаталоги в каталоге:

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

Ответ 15

du -sm * | sort -nr

Вывод по размеру

Ответ 16

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

Может случиться так, что размер файлов отличается, например. сравнивая один и тот же каталог на локальном жестком диске и запоминающем устройстве USB. Я использую следующий script, включая 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"

Ответ 17

ncdu du

Эта удивительная утилита CLI позволяет легко находить большие файлы и каталоги в интерактивном режиме.

Например, из дерева известного проекта мы делаем:

sudo apt-get install ncdu
ncdu

Итог свой:

enter image description here

Затем я вхожу вниз и вправо на клавиатуре, чтобы перейти в папку /drivers, и я вижу:

enter image description here

ncdu вычисляет размеры файлов рекурсивно только один раз при запуске для всего дерева, так что это эффективно.

"Общее использование диска" и "Кажущийся размер" аналогичны du, и я объяснил это по следующей причине: почему выходные данные du часто так отличаются от du -b

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

Смежные вопросы:

Проверено в Ubuntu 16.04.

ncdu неинтерактивное использование

Еще одна интересная особенность 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.

Ответ 18

Рекурсивно отображать текущие файлы каталогов и подкаталогов:

du -h .

Чтобы отобразить информацию о том же размере, но без, рекурсивную печать своих подкаталогов (что может быть огромным списком), используйте параметр -max-depth:

du -h --max-depth=1 .

Ответ 19

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

du -sh

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

du -sh *

Мне потребовалось некоторое время, чтобы понять, что Nautilus отправляет удаленные файлы в папку Trash, и эта папка не указана в команде du -sh *. Поэтому просто хотел поделиться этим, если кто-то столкнулся с той же проблемой.

Ответ 20

Хм, лучше всего использовать эту команду:

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

Затем вы сможете получать все размеры папок по всему серверу. Легко помочь вам найти самые большие размеры.

Ответ 21

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

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

Ответ 22

Следующее легко запомнить

ls -ltrapR

список содержимого каталога

-l использовать формат длинного списка

-t сортировка по времени модификации, сначала самая новая

-r, - -r обратный обратный порядок при сортировке

-a, - -a не будут игнорировать записи, начинающиеся с.

-p, --indicator-style = косая черта добавить/индикатор в каталогах

-r, - -r рекурсивный список подкаталогов eursive

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

Ответ 23

поместите в сценарий инициализации, как .bashrc... настройте def по мере необходимости.

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

Ответ 24

Если вы хотите больше контролировать size списка каталогов, вы можете использовать переключатель threshold (-t), как -t:

$ du -ht 1000000000 | sort --reverse

du - d ИСК u шалфея
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).

Ответ 25

введите "ls -ltrh/path_to_directory"