Я использовал df -h для вывода информации об использовании диска, удобочитаемой человеком. Хотелось бы разобраться, что занимает так много места. Например, есть ли способ передать эту команду по конвейеру, чтобы она распечатывала файлы размером более 1 ГБ? Другие идеи?
Спасибо
Вы можете попробовать ncdu
утилита находится по адресу: http://dev.yorhel.nl/ncdu
Он быстро суммирует содержимое файловой системы или дерева каталогов и распечатывает результаты, отсортированные по размеру. Это действительно хороший способ в интерактивном режиме изучить, что занимает место на диске.
Кроме того, это может быть быстрее, чем некоторые du
комбинации.
Типичный вывод выглядит так:
ncdu 1.7 ~ Use the arrow keys to navigate, press ? for help
--- /data ----------------------------------------------------------------------------------------------------------
163.3GiB [##########] /docimages
84.4GiB [##### ] /data
82.0GiB [##### ] /sldata
56.2GiB [### ] /prt
40.1GiB [## ] /slisam
30.8GiB [# ] /isam
18.3GiB [# ] /mail
10.2GiB [ ] /export
3.9GiB [ ] /edi
1.7GiB [ ] /io
1.2GiB [ ] /dmt
896.7MiB [ ] /src
821.5MiB [ ] /upload
691.1MiB [ ] /client
686.8MiB [ ] /cocoon
542.5MiB [ ] /hist
358.1MiB [ ] /savsrc
228.9MiB [ ] /help
108.1MiB [ ] /savbin
101.2MiB [ ] /dm
40.7MiB [ ] /download
Я часто использую это.
du -kscx *
Запуск может занять некоторое время, но он сообщит вам, где используется дисковое пространство.
Вы можете использовать команду find. Пример:
find /home/ -size +1073700000c -print
Я сам использую
du -c --max-depth=4 /dir | sort -n
это возвращает объем пространства, используемого каталогом и его подкаталогами глубиной до 4, sort -n
поставлю самую большую последнюю.
Новые версии sort
может обрабатывать "удобочитаемые" размеры, поэтому можно использовать гораздо более читаемые
du -hc --max-depth=4 /dir | sort -h
С удобочитаемыми размерами:
du -hscx *
Как я должен был определить, что занимает так много места? много времени я писал этот небольшой скрипт для поиска большого занятия на определенном устройстве (без аргументов это будет просматривать текущий каталог, ища > 256 МБ записи каталога):
#!/bin/bash
humansize() {
local _c=$1 _i=0 _a=(b K M G T P)
while [ ${#_c} -gt 3 ] ;do
((_i++))
_c=$((_c>>10))
done
_c=$(( ( $1*1000 ) >> ( 10*_i ) ))
printf ${2+-v} $2 "%.2f%s" ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${_a[_i]}
}
export device=$(stat -c %d "${1:-.}")
export minsize=${2:-$((256*1024**2))}
rdu() {
local _dir="$1" _spc="$2" _crt _siz _str
while read _crt;do
if [ $(stat -c %d "$_crt") -eq $device ];then
_siz=($(du -xbs "$_crt"))
if [ $_siz -gt $minsize ];then
humansize $_siz _str
printf "%s%12s%14s_%s\n" "$_spc" "$_str" \\ "${_crt##*/}"
[ $d "$_crt" ] && rdu "$_crt" " $_spc"
fi
fi
done < <(
find "$_dir" -mindepth 1 -maxdepth 1 -print
)
}
rdu "${1:-.}"
Пример использования:
./rdu.sh /usr 100000000
1.53G \_lib
143.52M \_i386-linux-gnu
348.16M \_x86_64-linux-gnu
107.80M \_jvm
100.20M \_java-6-openjdk-amd64
100.17M \_jre
99.65M \_lib
306.63M \_libreoffice
271.75M \_program
107.98M \_chromium
99.57M \_lib32
452.47M \_bin
2.50G \_share
139.63M \_texlive
129.74M \_texmf-dist
478.36M \_locale
124.49M \_icons
878.09M \_doc
364.02M \_texlive-latex-extra-doc
359.36M \_latex
Маленькая проверка:
du -bs /usr/share/texlive/texmf-dist
136045774 /usr/share/texlive/texmf-dist
echo 136045774/1024^2 | bc -l
129.74336051940917968750
Примечание: использование -b
вместо того -k
сказать du
для суммирования только использованных байтов, но не эффективного зарезервированного пространства (блоком по 512 байт). Для работы с размером блоков необходимо изменить строку du -xbs ...
по du -xks
подавить b
в _a=(K M G T P)
и разделите размер аргумента на 1024.
... Есть модифицированная версия (оставлю себе) с использованием блоки размеры по умолчанию, но принимаются -b
в качестве первого аргумента для вычисления байтов:
После некоторой работы есть много более новой версии быстрее и с выводом, отсортированным в порядке убывания размера:
#!/bin/bash
if [ "$1" == "-b" ] ;then
shift
export units=(b K M G T P)
export duargs="-xbs"
export minsize=${2:-$((256*1024**2))}
else
export units=(K M G T P)
export duargs="-xks"
export minsize=${2:-$((256*1024))}
fi
humansize() {
local _c=$1 _i=0
while [ ${#_c} -gt 3 ] ;do
((_i++))
_c=$((_c>>10))
done
_c=$(( ( $1*1000 ) >> ( 10*_i ) ))
printf ${2+-v} $2 "%.2f%s" ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${units[_i]}
}
export device=$(stat -c %d "${1:-.}")
rdu() {
local _dir="$1" _spc="$2" _crt _siz _str
while read _siz _crt;do
if [ $_siz -gt $minsize ];then
humansize $_siz _str
printf "%s%12s%14s_%s\n" "$_spc" "$_str" \\ "${_crt##*/}"
[ -d "$_crt" ] &&
[ $(stat -c %d "$_crt") -eq $device ] &&
rdu "$_crt" " $_spc"
fi
done < <(
find "$_dir" -mindepth 1 -maxdepth 1 -xdev \
\( -type f -o -type d \) -printf "%D;%p\n" |
sed -ne "s/^${device};//p" |
tr \\n \\0 |
xargs -0 du $duargs |
sort -nr
)
}
rdu "${1:-.}"
Чтобы отобразить 20 самых больших каталогов в текущей папке, используйте следующую строку:
du -ah . | sort -rh | head -20
или:
du -a . | sort -rn | head -20
Для 20 самых больших файлов в текущем каталоге (рекурсивно):
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20
или с удобочитаемыми размерами:
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20
Вторая команда для правильной работы на OSX / BSD (как
sort
не имеет-h
), вам необходимо установитьsort
изcoreutils
. Затем добавьте папку bin в свойPATH
.
Так что эти псевдонимы полезно иметь в вашем rc файлы (каждый раз, когда вам это нужно):
alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'