Команда '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