Думаю, тебе стоит использовать это. Как я только что узнал, это стандартная утилита POSIX-specified .
du
Опции, указанные в POSIX, включают:
Утилита du должна соответствовать XBD Utility Syntax Guidelines .
Поддерживаются следующие опции:
-a
.
Кроме вывода по умолчанию, сообщите размер каждого файла, не относящегося к директории типа в файловой иерархии, корни которой лежат в указанном файле. Независимо от наличия опции -a, в списке всегда должны быть указаны недиректории, заданные в качестве файловых операндов. -H
Если в командной строке указана символическая ссылка, то du считает размер файла или иерархии файлов, на которые ссылается ссылка. -k
Запишите размер файлов в единицах измерения 1024 байта, а не в единицах измерения по умолчанию 512 байт. -L
Если символическая ссылка указана в командной строке или встречается во время обхода файловой иерархии, то du считает размер файла или файловой иерархии, на которые ссылается ссылка. -s
Вместо вывода по умолчанию сообщайте только общую сумму по каждому из указанных файлов. -x
При оценке размеров файлов оценивайте только те файлы, которые имеют то же устройство, что и файл, указанный файловым операндом.
Указание более чем одной из взаимоисключающих опций -H и -L не считается ошибкой. Последняя указанная опция определяет поведение утилиты. Проблема заключается в том, что она не сообщает о размере файла, а сообщает на disk-usage . Это разные понятия, и различия зависят от файловой системы. Если вы хотите получить размер файлов для набора файлов, вы можете использовать что-то вроде:
{ echo
/usr/bin/ls -ndL .//*
} | sed '/\n/P;//D;N
\|//|s|\n|/&/|
$s|$|/|;s| .//|/\
/|;2!P;D'
Это довольно простой бит sed
, который поддерживает двухстрочное адресное окно на выходе ls
. Он работает, скользя по своему входу - всегда P
прокручивая затем D
поднимая самую старую из двух строк в своем шаблоне, а затем вытягивая N
ext input line, чтобы заменить его. По сути, это однострочный взгляд.
У него есть некоторые существенные недостатки в том виде, как они написаны. Например, для собственного удобства я избегал работы с ls
-> linkpath
и вместо этого использовал опцию -Ls
, которая заставляет ls
сообщать о цели соединения, а не о самом соединении. Она также предполагает только глобусы текущего каталога. Это зависит от /
not происходящего в именах файлов - потому что это разделитель. На самом деле это довольно часто встречается - вы cd
попадаете в каталог и cd -
отступаете.
Все это может быть обработано, может быть, в несколько строк или больше, но это всего лишь демонстрация.
Ключевой компонент здесь - и причина просмотра - вот этот бит:
\|//|s|\n|/&/|
Когда самая новая линия в пространстве шаблонов содержит строку .//
добавьте /
к хвосту самой старой линии и вставьте /
в голову самой новой. Затем я также заменяю .//
на другой \n
швеллер и еще два швеллера с линейным разделением.
И вот это:
drwxr-xr-x 1 1000 1000 6 Aug 4 14:40 .//dir*
drwxr-xr-x 1 1000 1000 0 Aug 4 14:40 .//dir1
drwxr-xr-x 1 1000 1000 6 Aug 8 17:34 .//dir2
drwxr-xr-x 1 1000 1000 22 Aug 10 18:12 .//dir3
drwxr-xr-x 1 1000 1000 16 Jul 11 21:59 .//new
-rw-r--r-- 1 1000 1000 8 Aug 20 11:32 .//newfile
-rw-r--r-- 1 1000 1000 0 Jul 6 11:24 .//new
file
-rw-r--r-- 1 1000 1000 0 Jul 6 11:24 .//new
file
link
становится таким:
/drwxr-xr-x 1 1000 1000 6 Aug 4 14:40/
/dir*/
/drwxr-xr-x 1 1000 1000 0 Aug 4 14:40/
/dir1/
/drwxr-xr-x 1 1000 1000 6 Aug 8 17:34/
/dir2/
/drwxr-xr-x 1 1000 1000 22 Aug 10 18:12/
/dir3/
/drwxr-xr-x 1 1000 1000 16 Jul 11 21:59/
/new/
/-rw-r--r-- 1 1000 1000 8 Aug 20 11:32/
/newfile/
/-rw-r--r-- 1 1000 1000 0 Jul 6 11:24/
/new
file/
/-rw-r--r-- 1 1000 1000 0 Jul 6 11:24/
/new
file
link/
Но что это за польза, верно? Ну, это все меняет:
IFS=/; set -f; set $(set +f
{ echo
/usr/bin/ls -ndL .//*
}| sed '/\n/P;//D;N
\|//|s|\n|/&/|
$s|$|/|;s| .//|/\
/|;2!P;D'
)
unset IFS
while [ -n "$2" ]
do printf 'Type :\t <%.1s>\tSize :\t %.0s%.0s%.0s<%d>%.0s%.0s%.0s\nFile :\t %s\n' \
$2 "<$4>"
shift 4; done
Type : Size : <6>
File :
Type : Size : <0>
File :
Type : Size : <6>
File :
Type : Size : <22>
File :
Type : Size : <16>
File :
Type : <-> Size : <8>
File :
Type : <-> Size : <0>
File :
Type : <-> Size : <0>
File :
Это не хорошая идея, чтобы использовать NetFilter для этого. Вам нужен обратный прокси [1], например, nginx или apache.
Если вы хотите использовать iPtable, вы можете отфильтровать от интерфейса в зависимости от поглощения:
iptables -t nat -A OUTPUT -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4000
Согласитесь с комментариями @Bratchley, мне удалось заставить его работать, добавив опцию --uid-owowner
.
Эту команду я использую:
iptables -t nat -A OUTPUT -m owner --uid-owner 1000 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4000
Так как на сервере apache есть определенный пользователь, перенаправляется только трафик с uid 1000.