Назад | Перейти на главную страницу

Как я могу определить, что занимает так много места?

Я использовал 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'