Um problema comum ao lidar com nomes de arquivos / diretórios é quando eles contêm espaços em branco. * Os caminhos de arquivo nix podem conter \n
newlines. Para contornar todos os problemas de espaço em branco, você precisa trabalhar com um delimitador nulo \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 "\: directory NOT found: $1"; exit 1; }
size=$2 # size in bytes
[[ -z $2 || -n ${2//[0-9]} ]] && { echo "\: 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!!!!