3

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

4 ответа4

2

Поместите это объявление функции оболочки в ваши скрипты инициализации оболочки:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

Я назвал его 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 -- "$@" | cut -f1 в качестве первого файла (на самом деле входной поток) и вывод ls -ld -- "$@" в качестве второго файла.

В функции "$@" будет вычислять список всех аргументов командной строки, каждый в двойных кавычках. Таким образом, он будет понимать символы и имена с пробелами и т.д.

Двойные минусы (--) сигнализируют об окончании опций командной строки для du и ls . Без них, говоря duls -l путал du и любой вариант для du что ls не смутит ls (и варианты , которые существуют в обеих утилитах не может означать то же самое, и это было бы довольно беспорядок).

cut после du просто вырежет первый столбец du -hs выхода (размеры).

Я решил разместить вывод du слева, иначе мне пришлось бы работать с колеблющимся правым столбцом (из-за разной длины имен файлов).

Команда не будет принимать флаги командной строки.

Это было проверено как в bash и в ksh93 . Он не будет работать с /bin/sh .

1

Мне удалось сделать то, что вы хотите с некоторыми довольно сложными вызовами sed :-

ls -d Directory/*|while l="$(line)";\
   do s=$(du -sb "$l"|sed "s/^\([0-9]*\).*$/\1/"); ls -ld "$l"|\
      sed "s/^\(d[^ ]*  *[^ ]*  *[^ ]*  *[^ ]* \) *[^ ]* /\1\[$s\] /g";\
   done

Заметка:-

  1. Я поставил квадратные скобки вокруг размеров каталогов, чтобы отличать их от размеров файлов.
  2. Табулирование в записях каталога будет смещено из-за разной длины строк в размерах, сообщаемых du , но команды могут быть уточнены дополнительно, чтобы учесть это.
  3. Было бы значительно проще, если бы в именах файлов не было пробелов или других непечатаемых символов.
  4. Команда работает путем замены размера каталога, возвращаемого ls -l на размер, возвращаемый du -s ; Из-за сложности подстановки du вызывается перед разработкой, если это необходимо, для упрощения написания сценариев.
  5. Было бы лучше использовать что-то вроде [ "$l" == "${l#d}" ] && echo "$l" || { s=$(du ...); sed ...; } проверить каталог и только потом вызвать du и произвести подстановку.
  6. Если у вас нет командной line , вы можете использовать во while read -r l; do ... , но это теряет начальные и конечные пробелы, поэтому я использую line как само собой разумеющееся.

Я написал сценарий line который использует read , сохраняя все пробелы:

read -r; r=$?; echo "$REPLY"; return $r 2>/dev/null; exit $r

(Сложная последовательность возврата / выхода останавливает выход оболочки при вызове с использованием . / source .)

1

ls -l покажет вам размеры файлов в каталоге. du -sh * покажет вам размер каталогов.

-1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .