Использование 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"