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

Это работает на меня;-! (в текущей среде MingW)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# barney отображается как красный текст

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
10
08.04.2011, 01:55
6 ответов

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

du -smc * | sort -n

Это проигнорирует скрытые файлы, но это - другой легкая фиксация:

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

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

7
27.01.2020, 20:01
  • 1
    . Я интересуюсь Вашим сценарием, если Вы будете так добры. –  xralf 06.04.2011, 22:18
  • 2
    Использовать sort -nr если Вы хотите самые большие значения на вершине. –  LawrenceC 07.04.2011, 05:55

Перечислять файлы где угодно под /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 can произвел “человекочитаемые” размеры (с 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}'
3
27.01.2020, 20:01
  • 1
    . Те команды полезны, но я интересуюсь только файлами и каталогами непосредственно под tmp, не файлы в подкаталогах –  xralf 07.04.2011, 16:31
  • 2
    @xralf: Затем используйте только вторую форму du звонить. –  Gilles 'SO- stop being evil' 07.04.2011, 22:59
  • 3
    Взгляды хороший, но лучший результат с МБ и ГБ как forcefsck отправлены. –  xralf 08.04.2011, 10:34

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

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

3
27.01.2020, 20:01
  • 1
    Это - хорошее короткое решение, но это печатает только каталоги. –  xralf 07.04.2011, 21:22
  • 2
    , О, извините, Вы правы. Я никогда не сталкивался с этой проблемой с файлами. Howewer, я нашел, как заставить его работать с файлами: использование - весь swicth. –  rvs 08.04.2011, 09:57
  • 3
    Большое правильное решение. penguin359 имеет немного лучше, потому что он показывает размеры в МБ. Лучшим было бы решение forcefsck, но его решение опускает каталоги с пробелами. –  xralf 08.04.2011, 10:51

С текущей версией вида гну (и одалживающий @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 не включать подкаталоги.

1
27.01.2020, 20:01
  • 1
    , я хотел довольно дисковое пространство, используемое файлами и каталогами (общий размер данных внутри) непосредственно под tmp (не подкаталоги). Моя команда вида не имеет-h опции. –  xralf 07.04.2011, 16:40
  • 2
    я не на 100% уверен, что Вы имеете в виду, так как Вы уже приняли ответ с тем же выбором шаблона файла. Отредактированный мое сообщение для не включения subdirs. Если Вы хотите очевидный размер а не использованное пространство фактической дисковой емкости, можно добавить --apparent-size к du параметрам. –  forcefsck 07.04.2011, 21:00
  • 3
    Теперь это работает хорошее. Я только должен искать ГБ и затем МБ, но это не проблема. –  xralf 07.04.2011, 21:29
  • 4
    у меня были буквы единицы в неправильном порядке, теперь зафиксированном. Если Вы хотите порядок от большого до маленького, изменяете порядок букв единицы и добавляете-r к виду. –  forcefsck 07.04.2011, 22:07
  • 5
    , который я заметил, это забыло печатать размер каталога (без. префикс) –  xralf 07.04.2011, 22:24

ОБНОВЛЕНИЕ: я фрагментировал предыдущий сценарий. Вот новая версия, с помощью 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."* 
#
0
27.01.2020, 20:01
  • 1
    Когда Вы говорите, что размеры всех файлов и каталогов, сделайте Вы имеете в виду пространство, которое каждый объект поднимает на диске (например, в моей файловой системе Ubuntu ext4, пустой каталог берет 4k дискового пространства и файл, меньший, чем 4k поднимает 4k. Минимальный блок выделения является 4k).. или Вы имеете в виду объем данных в каждом файле, например, 100 (байты).. И для каталогов, сделайте Вы хотите знать общее количество данных файла в том каталоге.. Если Вы действительно хотите размер данных в файлах, то tree делает это. если Вы хотите используемое дисковое пространство, то du делает это... (tree не составляет каталог), шоу дисковой утилиты –  Peter.O 07.04.2011, 15:17
  • 2
    'du' является лучшим выбором... Я только что заметил в man du, то, что это может также сообщить об "очевидном размере файла".... The apparent size of a file is the number of bytes reported by туалет-c' на регулярных файлах, или в более общем плане, ls -l --block-size=1' or статистика - формат = s' %. Например, файл, содержащий слово zoo' with no newline would, of course, have an apparent size of 3. –  Peter.O 07.04.2011, 15:50
  • 3
    я хотел довольно дисковое пространство, используемое файлами и каталогами (общий размер данных внутри) непосредственно под tmp (не подкаталоги) –  xralf 07.04.2011, 16:34
  • 4
    я сожалею, я не нахожусь на этапе сценариев оболочки, я мог понять это все же, таким образом, я позволяю ему другим пользователям, чтобы решить, как хороший ответ это. Спасибо за Вашу работу. Я изучу его, когда я буду лучше. –  xralf 08.04.2011, 10:43
find /tmp -exec du {} + | sort -nr | less 

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

0
27.01.2020, 20:01

Теги

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