5

Я хочу найти папки, размеры которых превышают 1 ГБ, а затем, если они закончились, я хочу стереть их.

Я нашел несколько команд, таких как

find /some/path -type d -size +1G -exec ls {} \;

или же

du -h /some/path | grep ^[0-9.]*G

или (более 600 м)

du -h /some/path/ | grep ^[6-9][0-9][0-9][0-9.]*M | sort

Но эти две команды не очень помогают мне, потому что команда find не находит никаких папок, хотя есть папки размером более 1 ГБ, но Linux считает, что они являются небольшими КБ. Есть ли команда для этого?

6 ответов6

4

Распространенной проблемой при работе с именами файлов / каталогов является то, что они содержат пробелы. * nix filepaths может даже содержать \n переводы строки. Чтобы обойти все проблемы с пробелами, вам нужно работать с нулевым разделителем \x00 .

#!/bin/bash
#
# Parameter 1 ("$1"):  Remove sub-directories from this directory
# Parameter 2 ("$2"):  Remove sub-directories larger than this many bytes 
#
# Example, To remove sub-directories bigger than 1 GB from your HOME directory
#   
#    script "$HOME"  $((2**30))     
#        
dir="$1"; shopt -s extglob; dir="${dir%%+(/)}"  # remove trailing / from directory path
[[ -d "$dir" ]] || { echo "\$1: directory NOT found: $1"; exit 1; }

size=$2  # size in bytes
[[ -z $2 || -n ${2//[0-9]} ]] && { echo "\$2: size-threshold must be numeric: $2"; exit 2; }

du -0b "$dir" |                        # output with \x00 as end-of-path
 sort -zrn  |                          # sort dirs,largest first
  awk -vRS="\x00" -vORS="\x00" -v"size=$size" -v"dir=$dir" -v"prev=\x00" '{
     if( $1<=size ) next               # filter by size; skip small dirs
     match( $0, "\x09" )               # find du TAB-delimiter           
     path = substr( $0, RSTART+1 )     # get directory path 
     if( path ~ "^"dir"/*$" ) next     # filter base dir; do not kill it! 
     match( path, "^" prev ".+" )      # print (ie. process) parent dirs only
     if( RSTART == 0 ) { print path }
     prev = path }' |
   xargs -0 -I{} echo rm -vr {}        # remove the `echo` to run live!!!!
1

Осторожно удаляет все файлы и каталоги выше 1 ГБ по указанному пути

du -sh -t1000000000 /some /path /* | awk -F "" '{print $ 2}' | xargs rm -rf

1

Чтобы найти папки размером более 10G:du -h /mnt/backup/ |awk '$1 ~ /[0-9]*G/ {print}' |sort -nr|sed 's/G//g' |awk '{ if ( $1 > 10.0 ) print }'

Вы можете изменить 10.0 на любое число и /mnt /backup на любой путь, он будет распечатывать папки, которые соответствуют их размеру в ГБ.

1

То, что вы просите, это ужасная идея. Это происходит главным образом из-за того, как работает то, что вы просили: если папка foo содержит более 1 ГБ, каждая родительская папка foo также содержит больше этого (потому что она содержит папку foo).

Таким образом, если вы сканируете /home/myuser/myfolder/ для вещей большего размера и /home/myuser/myfolder/bar/quz/baz/foo is, /home/myuser/myfolder/bar/quz/baz , /home/myuser/myfolder/bar/quz/ /home/myuser/myfolder/bar/ и /home/myuser/myfolder/ будут помечены для удаления.

Вы можете обойти это с опцией -S для du.

Это дает результат (ТО, ЧТО Я НЕ РЕКОМЕНДУЮ РАБОТАТЬ)

du -Sb $DIR | grep '^[0-9]\{10\}' | cut -f 2- | xargs -d "\n" rm -rf

Это не удастся для каталогов, имена которых содержат символы новой строки. Устранение этого недостатка оставлено читателю в качестве упражнения.

Если вы хотите, чтобы другой размер составлял регулярное выражение, соответствующее ему. du -b возвращает размеры в байтах, поэтому работайте оттуда. ПОДСКАЗКА: 365 МБ или больше будет '^\([0-9]\{10\}\|[4-9][0-9]\{8\}\|3[7-9][0-9]\{7\}\|36[6-9][0-9]\{6\}\)' .

0

используйте du -h чтобы получить список файлов и каталогов с их размерами. Затем вы можете использовать sed чтобы извлечь имена папок, которые вы хотите стереть, и передать их в rm . Это может быть реализовано в виде bash-скрипта или команды в любой оболочке, которая вам нравится. Если вам нужна дополнительная помощь в написании команды, дайте мне знать. Хотя чтение справочных страниц вышеупомянутых команд должно помочь вам выполнить вашу задачу.

0

вы можете найти папки, используя du -sm * | awk '$1 > 1000'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .