ls
перечисляет содержимое каталога. du
перечисляет размер содержимого каталога. Есть ли способ получить список, похожий на ls
но с каталогами, показывающими размер контента?
4 ответа
Поместите это объявление функции оболочки в ваши скрипты инициализации оболочки:
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
.
Мне удалось сделать то, что вы хотите с некоторыми довольно сложными вызовами 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
Заметка:-
- Я поставил квадратные скобки вокруг размеров каталогов, чтобы отличать их от размеров файлов.
- Табулирование в записях каталога будет смещено из-за разной длины строк в размерах, сообщаемых
du
, но команды могут быть уточнены дополнительно, чтобы учесть это. - Было бы значительно проще, если бы в именах файлов не было пробелов или других непечатаемых символов.
- Команда работает путем замены размера каталога, возвращаемого
ls -l
на размер, возвращаемыйdu -s
; Из-за сложности подстановкиdu
вызывается перед разработкой, если это необходимо, для упрощения написания сценариев. - Было бы лучше использовать что-то вроде
[ "$l" == "${l#d}" ] && echo "$l" || { s=$(du ...); sed ...; }
проверить каталог и только потом вызватьdu
и произвести подстановку. - Если у вас нет командной
line
, вы можете использовать воwhile read -r l; do ...
, но это теряет начальные и конечные пробелы, поэтому я используюline
как само собой разумеющееся.
Я написал сценарий line
который использует read
, сохраняя все пробелы:
read -r; r=$?; echo "$REPLY"; return $r 2>/dev/null; exit $r
(Сложная последовательность возврата / выхода останавливает выход оболочки при вызове с использованием .
/ source
.)
ls -l
покажет вам размеры файлов в каталоге. du -sh *
покажет вам размер каталогов.
Если вы прочитаете команду man of ls
, вы увидите, что есть опция -h
, которая показывает вам в удобочитаемом виде размер каждого файла в каталоге.