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

10

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

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

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

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

xralf
источник

Ответы:

7

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

du -smc * | sort -n

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

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

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

penguin359
источник
Спасибо. Я заинтересован в вашем сценарии, если вы будете так добры.
xralf
1
Используйте, sort -nrесли вы хотите самые большие значения сверху.
LawrenceC
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}'
Жиль "ТАК - перестань быть злым"
источник
Спасибо. Эти команды полезны, но меня интересуют только файлы и каталоги, которые находятся непосредственно под tmp, а не файлы в подкаталогах
xralf
1
@xralf: тогда используйте только вторую форму duвызова.
Жиль "ТАК - перестань быть злым"
Выглядит хорошо, но лучший результат - с MB и GB, как выложил forcefsck.
xralf
3

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

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

RVS
источник
Это хорошее короткое решение, но оно печатает только каталоги.
xralf
Ой, прости, ты прав. Я никогда не сталкивался с этой проблемой с файлами. Однако, я нашел, как заставить это работать с файлами: использование --all swicth.
РВС
Отличное правильное решение. У penguin359 немного лучше, потому что он показывает размеры в МБ. Лучшим было бы решение forcefsck, но его решение опускает каталоги с пробелами.
xralf
1

С текущей версией сортировки gnu (и заимствованием шаблона файла @ 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

РЕДАКТИРОВАТЬ: добавлен параметр -S,du чтобы не включать подкаталоги.

forcefsck
источник
Я хотел скорее дисковое пространство, используемое файлами и каталогами (общий объем данных внутри) непосредственно под tmp (не подкаталогами). У моей команды сортировки нет опции -h.
xralf
Я не на 100% уверен, что вы имеете в виду, поскольку вы уже приняли ответ с тем же выбором файла. Отредактировал мой пост, чтобы не включать subdirs. Если вам нужен видимый размер, а не фактическое используемое дисковое пространство, вы можете добавить --apparent-sizeк параметрам du.
forcefsck
Теперь это работает хорошо. Мне нужно только искать ГБ, а затем МБ, но это не проблема.
xralf
У меня были буквы в неправильном порядке, теперь исправлены. Если вы хотите, чтобы порядок был большим или маленьким, измените порядок букв единиц и добавьте -r для сортировки.
forcefsck
Я заметил, что забыли напечатать размер каталога (без префикса)
xralf
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
источник
Когда вы говорите размеры всех файлов и каталогов , вы имеете в виду пространство, занимаемое каждым элементом на диске (например, в моей файловой системе Ubuntu ext4 , пустой каталог занимает 4 КБ дискового пространства, а файл размером менее 4 К занимает 4 КБ). Минимальный блок выделения составляет 4 КБ. .. или вы имеете в виду объем данных в каждом файле, например, 100 (байт). А для каталогов вы хотите узнать общее количество файловых данных в этом каталоге ... Если вы хотите размер данных внутри файлов, а затем treeделает это. если вы хотите использовать дисковое пространство, то duделает это ... ( treeне составляет каталог)
Peter.O
'du' - лучший выбор ... Я только что заметил man du, что он также может сообщать о "кажущемся размере файла" .... The apparent size of a file is the number of bytes reported by wc -c 'для обычных файлов или, в более общем смысле, ls -l --block-size=1' or stat --format =% s'. Например, файл, содержащий словоzoo' with no newline would, of course, have an apparent size of 3.
Peter.O
Я хотел скорее дисковое пространство, используемое файлами и каталогами (общий размер данных внутри) непосредственно под tmp (не подкаталогами)
xralf
Извините, я не нахожусь в стадии написания сценариев оболочки, я еще не мог понять это, поэтому я позволил другим пользователям решить, насколько хороший ответ. Спасибо вам за вашу работу. Я буду изучать это, когда мне станет лучше.
xralf
0
find /tmp -exec du {} + | sort -nr | less 

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

неизвестный пользователь
источник