Команда '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
Другие вопросы по тегам