Знайдіть найбільші файли чи каталоги


10

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

Вихід може бути наступним:

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

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

Відповіді:


7

Ось швидке виправлення, використовуйте du + sort. Спробуйте це:

du -smc * | sort -n

Це ігнорує приховані файли, але це ще одне просте виправлення:

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

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


Дякую. Мене цікавить твій сценарій, якщо ти будеш таким добрим.
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дзвінка.
Жил "ТАК - перестань бути злим"

Виглядає добре, але кращий результат - з МБ та ГБ, як розміщено forcefsck.
xralf

3

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

Він друкує розміри всіх файлів та підкаталогій першого рівня поточного dir.


Приємне коротке рішення, але воно друкує лише каталоги.
xralf

О, вибачте, ти маєш рацію. Я ніколи не стикався з цією проблемою з файлами. Хоуер, я знайшов, як змусити його працювати з файлами: використовуючи - all swicth.
rvs

Прекрасне правильне рішення. 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

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


Я хотів скоріше дисковий простір, який використовуються файлами та каталогами (загальний розмір даних всередині) безпосередньо під tmp (не підкаталогами). У моїй команді сортування немає параметра -h.
xralf

Я не на 100% впевнений, що ви маєте на увазі, оскільки ви вже прийняли відповідь з тим самим вибором шаблону файлів. Відредагував мою публікацію, щоб не включати підкаталоги. Якщо ви хочете уявного розміру, а не фактичного використовуваного місця на диску, можете додати --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."* 
#

Коли ви говорите розміри всіх файлів і каталогів , чи маєте ви на увазі простір, який кожен елемент займає на диску (наприклад, у моїй файловій системі 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як тільки побачите достатньо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.