Найдите самые большие файлы или каталоги

Какая команда будет печатать размеры всех файлов и каталогов в каталоге tmp (включая скрытые) и сортировать их по размерам от самый большой в наименьшем в человеческом читаемом формате (например, 2 ГБ)?

Выход может быть следующим:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Я попытался использовать ls и du, но не удалось найти нужные коммутаторы.

10 голосов | спросил xralf 6 PMpWed, 06 Apr 2011 22:21:32 +040021Wednesday 2011, 22:21:32

6 ответов


7

Вот быстрое решение, используйте du + sort. Попробуйте следующее:

du -smc * | sort -n

Это будет игнорировать скрытые файлы, но это еще одно облегчение:

du -smc .[^.] .??* * | sort -n

Это может вызвать предупреждения о том, что один или несколько из приведенных выше шаблонов не соответствуют файлу. Первый шаблон .[^.] совпадает со всеми двумя именами символов, начиная с. кроме .., второй шаблон, .??* соответствует всем трем буквам или более именам файлов, начиная с. и * соответствует всем файлам, не начинающимся с. Для более сложного листинга, такого как поиск всего файла размером более X по всей файловой системе или поддержка списка роста файловой системы, у меня есть сценарий оболочки DIY, который я написал и могу поделиться, если вы заинтересованы.

ответил penguin359 6 PMpWed, 06 Apr 2011 22:29:35 +040029Wednesday 2011, 22:29:35
3

Чтобы перечислить файлы в любом месте /tmp, отсортированы по размеру:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Чтобы перечислить файлы и деревья каталога непосредственно в /tmp, отсортированы по размеру:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Чтобы перечислить все файлы и деревья каталогов в разделе /tmp, отсортированы по размеру:

du -ak /tmp | sort -k1n -k2

(Пример, иллюстрирующий разницу между тремя командами: если есть файл /tmp/dir/file, первая команда перечисляет /tmp/dir/file, второй список /tmp/dir, а третий список - как .)

Все приведенные выше команды показывают размеры в килобайтах. Хотя GNU du может выводить «удобочитаемые» размеры (с множителями k, M, G и т. Д.), Их сортировка - другое дело. Совсем недавно GNU coreutils (≥7.4) может сделать это: просто замените du -k на du -h и sort -k1n -k2 с помощью sort -k1h -k2. В противном случае, это грубый скрипт awk для преобразования в суффиксные размеры (округление); просто проведите вывод sort выше.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'
ответил Gilles 7 AMpThu, 07 Apr 2011 00:00:42 +040000Thursday 2011, 00:00:42
3

Я использую для него следующий псевдоним: alias ds='du -x --all --max-depth=1 . | sort -n'

Он печатает размеры всех файлов и подкаталогов 1-го уровня текущего каталога.

ответил rvs 7 PMpThu, 07 Apr 2011 22:05:04 +040005Thursday 2011, 22:05:04
1

В текущей версии gnu sort (и заимствования @ penguin359 файла)

cd /tmp; du -sShc .[^.] .??* * | sort -h

С более старой версией сортировки

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDIT: добавлен параметр -S в du, чтобы не включать подкаталоги.

ответил forcefsck 7 PMpThu, 07 Apr 2011 15:59:54 +040059Thursday 2011, 15:59:54
0

ОБНОВЛЕНИЕ: Я отменил предыдущий скрипт. Вот новая версия, используя du и awk (предыдущий использованный tree и sed)

Это вывод: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Вот сценарий

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#
ответил Peter.O 7 PMpThu, 07 Apr 2011 13:13:50 +040013Thursday 2011, 13:13:50
0
find /tmp -exec du {} + | sort -nr | less 

показывает самые большие файлы, поэтому вы можете q uit, как только увидите.

ответил user unknown 8 PMpFri, 08 Apr 2011 19:33:19 +040033Friday 2011, 19:33:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132