Управляйте 'ls' показ размера каталога вместо размера блока

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

Когда я делаю ls -s, это показывает мне block-size(4k всегда) вместо размера каталога.

Спасибо!!!

Редактирование - Частичный успех

Как сказано @Arronical, Командой du -sh * показывает файлы и каталоги с их размером. Одно маленькое улучшение я смотрю, должно отобразить каталог другим цветом как ls шоу. Любые идеи.Спасибо.:-)

0
задан 21 January 2016 в 19:56

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 - она показывает канонические 4 096 байтов

Упрощение

Эта команда сама может быть превращена в псевдоним, что-то как 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

Выходная организация

Нет никакого пути к colorize вывода исходно в 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

О ls и статистике

Почему люди всегда предлагают du ? izx в его кратком и потрясающем ответе объяснил это путь лучше, что я мог, но короче говоря на Unix и Linux все - файл, и в действительности каталог является файлом со списком файлов, связанных с ним. Таким образом, stat и ls дайте размер того специального файла, не общую сумму всех файлов, связанных с каталогом. Но du то, что спасает положение. Отметьте что описание в man du говорит:

Суммируйте использование диска каждого ФАЙЛА, рекурсивно для каталогов.

du утилита спрыгивает в каждый каталог и подводит итог размера файла каждого файла там. Путь, отличающийся, от какой ls и stat сделать.

Таким образом, цель каждой утилиты очень отличается. ls делает точно, что просят сделать - перечисляют размеры файла, и прибывающий из мира Windows, мы понимаем размер каталога, как являющийся этой "сумкой", размер которой зависит от количества яблок в нем, если я могу использовать его для сравнения. Unix немного отличается, да, но это реалистично. Возможно, это не угождает пользовательским потребностям так очень, но это имеет смысл в реальном, физическом смысле.

На ноте стороны размер блока по умолчанию 4k, но после того как файл растет по 4k, файловая система должна будет выделить больше места. Например, моя домашняя папка имеет 73 ГБ в общем размере всех файлов там. Что относительно размера блока каталога?

DIR:/bin
skolodya@ubuntu:$ ls -ld $HOME
drwxr-xr-x 94 xieerqi xieerqi 16384 Jan 22 07:24 /home/xieerqi/
4
ответ дан 29 September 2019 в 13:48

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

использование Попытки:

du -sh ./*

должно быть возможно создать функцию или сценарий, который дает Вам информацию относительно того, является ли это файлом или каталогом, для которого отображается информация.

Как muru, на который указывают, -d или --max-depth, опция, с параметром 1, была бы полезна для списка просто каталогов. Это также работает вокруг того, что скрытые каталоги не перечислены нормальной оболочкой globbing (./* часть).

4
ответ дан 29 September 2019 в 13:48

Парсинг вывода 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
2
ответ дан 29 September 2019 в 13:48

Другие вопросы по тегам:

Похожие вопросы: