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


830

Можно ли использовать 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

Пролистав справочные страницы, я выхожу пустым.


4
вы хотите использовать вместо этого du -s
оружие

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

Ответы:


1552

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

du -sh *

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

du --summarize --human-readable *

Объяснение:

du: D isk U мудрец

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

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


55
Также -c (производим общее количество) - это хорошо.
Меридиус

50
du --max-глубина 1 показывает только размер файла / папки в дереве глубиной 1, больше не мешает и легко находит большие папки в папке.
Кузен Кокаин

12
как включить скрытые файлы тоже?
Закария Бракса

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

22
Чтобы получить четкое представление о том, куда уходит пространство, du -sch * .[!.]* | sort -rhэто здорово (показать отсортированный вывод). На Mac do: brew install coreutilsи затемdu -sch * .[!.]* | gsort -rh
Guig

320

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


11
Сначала добавьте | tail -rсортировку по величине.
Phrogz

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

14
sort -rhбудет хорошо работать с тем, du -cksh *как он сортирует читаемые человеком единицы.
Себи

@Sebi -h, к сожалению,
недопустимый

@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т.д. Это должно быть доступно на многих систем в настоящее время, но не все.
Евгений Сергеев

дух-шм * | сортировать -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'`. Я иногда очень ненавижу Макса = \
anon58192932

@ anon58192932 Вы можете задать вопрос, касающийся Mac, я уверен, что есть кто-то, кто мог бы помочь. Этот вопрос отмечен как GNU / Linux
Sebi

2
Есть ли способ сохранить цвет, используя этот ответ?
Пабло Кансеко

20

Вы хотите команду 'du -sk' du = "использование диска"

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

Флаг -s будет перечислять только вещи в каталоге верхнего уровня (то есть текущем каталоге по умолчанию или каталоге, указанном в командной строке). Странно, что du имеет противоположное поведение 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. Это не должно считаться ответом
само


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.
Сиро Сантилли 法轮功 冠状 病 六四 事件 法轮功


4

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

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

Пример вывода для /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

3

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

du -ksh * | sort -n -r

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

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

120K
12M
4G

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

Эта команда также работает на Mac (а sort -hне, например).


Если вы уберете -hфлаг из duкоманды, вы сократите этот недостаток
Карлос Рикардо

Или вы можете использовать -hвместо -nсортировки.
Себи

или просто
пропусти

3
du -S

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

Пример 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-глубина :

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

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

-Я использую формат длинного списка

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

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

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

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

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

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, МБ, ГБ, ТБ, PB, EB, ZB, YB (степени 1000).


0

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

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


0

поместите в сценарий инициализации, как .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.