Команда 'ls' показывает размер каталога вместо размера блока
Есть ли ls параметр, который я могу использовать для отображения размера файла для каталогов, а также.
Когда я делаю ls -sэто показывает мне block-size(Всегда 4к) вместо размера каталога.
Спасибо!!!
Редактировать - Частичное достижение
Как сообщает @Arronical, Command du -sh * показывает файлы и каталоги с их размером. Одно небольшое улучшение, которое я ищу, - показать каталог в другом цвете, например ls показывает. Есть идеи. Спасибо.:-)
3 ответа
Основная идея
Можно подражать ls -l с находкой. Например, как с find команда, которая будет работать du для каждого найденного каталога и файла:
find . -maxdepth 1 ! -name "." -printf "%M %u %g " -exec du -sh {} \; 2> /dev/null
Пример вывода (примечание, здесь я использую -type d показывать списки для каталогов только для демонстрационных целей; эта команда без -type d перечислит все файлы и каталоги):
DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 -type d ! -name "." -printf "%M %u %g " -exec du -sh {} \; 2> /dev/null | head
drwxrwxr-x xieerqi xieerqi 348K ./addRemoveDistribution
drwxr-xr-x xieerqi xieerqi 2.2G ./Downloads
drwxrwxr-x xieerqi xieerqi 4.0K ./.screenlayout
drwxr-xr-x xieerqi xieerqi 4.0K ./Public
drwxrwxr-x xieerqi xieerqi 28K ./Youku Files
drwxrwxr-x xieerqi xieerqi 142M ./.minecraft
drwx------ xieerqi xieerqi 20K ./.gnupg
drwxrwxr-x xieerqi xieerqi 2.5G ./.Genymobile
drwxrwxr-x xieerqi xieerqi 73M ./genymotion
drwxrwxr-x xieerqi xieerqi 104K ./scripts
ПРИМЕЧАНИЕ: find имеет -ls флаг, который я здесь не использую по той же причине, что и OP, - он показывает канонические 4096 байт
упрощение
Эта команда сама может быть превращена в псевдоним, что-то вроде ls2 или функция, которая затем также может принять $1 аргумент. Например, вот что я поместил в свой .bashrc и как это работает:
function lscwd
{
# Function to stat files and folders in current dir
# Takes first argument as directory to stat
# If no directory supplied, current dir assumed
if [ -z "$1" ];then
DIR="."
else
DIR="$1"
fi
find "$DIR" -maxdepth 1 ! -name "." -printf "%M %u %g " -exec du -sh {} \; 2> /dev/null
}
Образцы прогонов:
DIR:/xieerqi
skolodya@ubuntu:$ lsc
lscpu lscwd
skolodya@ubuntu:$ lscwd | head
drwxrwxr-x xieerqi xieerqi 348K ./addRemoveDistribution
drwxr-xr-x xieerqi xieerqi 2.2G ./Downloads
drwxrwxr-x xieerqi xieerqi 4.0K ./.screenlayout
drwxr-xr-x xieerqi xieerqi 4.0K ./Public
drwxrwxr-x xieerqi xieerqi 28K ./Youku Files
drwxrwxr-x xieerqi xieerqi 142M ./.minecraft
drwx------ xieerqi xieerqi 20K ./.gnupg
drwxrwxr-x xieerqi xieerqi 2.5G ./.Genymobile
drwxrwxr-x xieerqi xieerqi 73M ./genymotion
drwxrwxr-x xieerqi xieerqi 104K ./scripts
DIR:/xieerqi
skolodya@ubuntu:$ lscwd /etc | head
drwxr-xr-x root root 18M /etc
drwxr-xr-x root root 68K /etc/logrotate.d
drwxr-xr-x root root 36K /etc/apm
drwxr-xr-x root root 96K /etc/speech-dispatcher
drwxr-xr-x root root 28K /etc/jwm
drwxr-xr-x root root 8.0K /etc/hp
drwxr-xr-x root root 8.0K /etc/gtk-2.0
drwxr-xr-x root root 20K /etc/gtkmathview
drwxr-xr-x root root 68K /etc/xml
drwxr-xr-x root root 8.0K /etc/esound
Выходная организация
Там нет никакого способа, чтобы раскрасить вывод изначально find, который разработан специально для разбора имен файлов. ls раскраска происходит от специальных символов, включенных в вывод, которые мы на самом деле не хотим.
Тем не менее, можно прочитать разрешения. Ведущий - в -rwxr-xr-x означает, что это обычный файл, и ведущий d в drwxr-xr-x означает каталог.
find также имеет удобный -type флаг, который мы также можем использовать для фильтрации вывода. Например, вот отредактированная версия lscwd
function lscwd2
{
# Function to stat files and folders in current dir
# Takes first argument as directory to stat
# If no directory supplied, current dir assumed
if [ -z "$1" ];then
DIR="."
else
DIR="$1"
fi
# print directories first
printf "*** DIRECTORIES *** \n"
find "$DIR" -maxdepth 1 -type d ! -name "." -printf "%M %u %g " -exec du -sh {} \; 2> /dev/null
# print non-directories second
printf "*** FILES *** \n"
find "$DIR" -maxdepth 1 ! -type d ! -name "." -printf "%M %u %g " -exec du -sh {} \; 2> /dev/null
}
И образец вывода:
DIR:/bin
skolodya@ubuntu:$ lscwd2
*** DIRECTORIES ***
drwxrwxr-x xieerqi xieerqi 4.0K ./c
drwxrwxr-x xieerqi xieerqi 12K ./python
drwxrwxr-x xieerqi xieerqi 12K ./perl
drwxrwxr-x xieerqi xieerqi 4.0K ./ANOTHERDIR
drwxrwxr-x xieerqi xieerqi 4.0K ./random
drwxrwxr-x xieerqi xieerqi 108K ./sh
drwxrwxr-x xieerqi xieerqi 38M ./cs2
drwxr-xr-x xieerqi xieerqi 414M ./arduino-1.6.7
drwxrwxr-x xieerqi xieerqi 24K ./codereview
*** FILES ***
-rwxrwxr-x xieerqi xieerqi 4.0K ./preventShutdown.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./Dimmer.desktop
-rwxrwxr-x xieerqi xieerqi 4.0K ./updateWarning.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./somefile.txt
-rw-r--r-- xieerqi xieerqi 4.0K ./.bashrc
-rwxr-xr-x xieerqi xieerqi 4.0K ./setup.sh
-rwxrwxr-x xieerqi xieerqi 4.0K ./whiledemo.csh
-rwxr-xr-x xieerqi xieerqi 4.0K ./fmtcode.awk
-rwxrwxr-x xieerqi xieerqi 4.0K ./batmon.sh
-rwxr-xr-x xieerqi xieerqi 4.0K ./Dimmer.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./somefile2.txt
Вывод иногда может быть очень длинным, поэтому я бы предложил использовать эту функцию в сочетании с less пейджинговая утилита. Просто труба вывод, как это так lscwd2 | less
О лс и стат
Почему люди всегда предлагают du? izx в своем кратком и удивительном ответе объяснил это лучше, чем я мог, но в двух словах, в Unix и Linux все представляет собой файл, а в каталоге действительности - файл со списком связанных файлов. Таким образом, stat а также ls укажите размер этого специального файла, а не общий объем всех файлов, связанных с каталогом. Но du это то, что спасает день. Обратите внимание, что описание в man du говорит:
Суммируйте использование диска каждого ФАЙЛА, рекурсивно для каталогов.
du Утилита спрыгивает вниз в каждый каталог и суммирует размер каждого файла там. Значительно отличается от того, что ls а также stat делать.
Так что назначение каждой утилиты очень разное. ls делает именно то, что ему предлагается - перечисляет размеры файлов, и, исходя из мира Windows, мы понимаем размер каталога как "мешок", размер которого зависит от количества яблок в нем, если я могу использовать его для сравнения. Unix немного отличается, да, но это реально. Может быть, это не удовлетворяет потребности пользователей, но имеет смысл в реальном, физическом смысле.
Напомним, что размер блока по умолчанию равен 4 КБ, но как только размер файла превысит 4 КБ, файловой системе потребуется выделить больше места. Например, моя домашняя папка имеет общий размер всех файлов 73 ГБ. Как насчет размера блока каталога?
DIR:/bin
skolodya@ubuntu:$ ls -ld $HOME
drwxr-xr-x 94 xieerqi xieerqi 16384 Jan 22 07:24 /home/xieerqi/
Я не знаю каких-либо параметров для ls команда, которая может достичь этого, но можно найти размеры каталогов и файлов в текущем рабочем каталоге с помощью du команда.
Попробуйте использовать:
du -sh ./*
Должна быть возможность создать функцию или сценарий, который даст вам информацию о том, является ли это файл или каталог, для которого отображается информация.
Как отметил muru, -d или же --max-depth Параметр с параметром 1 будет полезен для перечисления только каталогов. Он также работает вокруг того факта, что скрытые каталоги не отображаются в списке при обычном перемещении оболочки (./* часть).
Разбор вывода ls всегда приводит к печали. Смотрите это объяснение. использование stat (man stat) вместо
от man stat:
NAME
stat - display file or file system status
SYNOPSIS
stat [OPTION]... FILE...
DESCRIPTION
Display file or file system status.
...
%b number of blocks allocated (see %B)
%B the size in bytes of each block reported by %b
...
%n file name
И пример на моей системе YMMV:
$ stat --format="%n %b %B" .bashrc $HOME
.bashrc 32 512
/home/w3 192 512