С помощью команды 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-страниц я прихожу пустой.

22 ответов


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

du -sh *

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

du --summary --human-readable *

объяснение:

du: Disk Uшалфей

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

-h: "удобочитаемое" на выходе. Используйте единичные суффиксы:Byte,Kibibyte (KiB),Mebibyte (MiB), Gibibyte (GiB), Tebibyte (TiB) и Pebibyte (PiB). (БАЗЫ2)


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


du -sh * | sort -h

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


чтобы перечислить самые большие каталоги из текущего каталога в удобочитаемом формате:

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

это делает его более удобным для чтения :)


, чтобы отобразить его в использовать:

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

код Awk объяснил:

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

пример вывода:

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

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

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

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


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

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.


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


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

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


посмотреть для этого


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

du -ksh * | sort -n -r

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

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

120K
12M
4G

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

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


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

du-sm * / sort-NR

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


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

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

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

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

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

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

iRetValue=0

uiLength=$(expr length "")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"\" - 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  | grep -v ^d | awk '{total+=;} 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"

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

du -h .

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

du -h --max-depth=1 .

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

du -sh

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

du -sh *

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


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

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

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


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

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


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


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

ls -ltrapR

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

- l используйте длинный формат листинга

- t сортировка по времени модификации, новейший первый

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

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

- p, --indicator-style=Слэш добавить / индикатор в каталоги

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

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