web-dev-qa-db-ja.com

1GBを超えるフォルダを見つけてLinuxターミナルで別のコマンドを実行する方法は?

サイズが1GBを超えるフォルダを見つけたいのですが、それを超えている場合は消去したいと思います。

私はのようないくつかのコマンドを見つけました

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

または

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

または(600M以上)

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

しかし、これら2つのコマンドは、1 GBを超えるフォルダーがあるにもかかわらず、findコマンドがフォルダーを検索しないため、実際には役に立ちませんが、Linuxはそれらを小さなKBと見なします。それを達成するためのコマンドはありますか?

5
xmux

ファイル/ディレクトリ名を扱うときの一般的な問題は、空白が含まれている場合です。 * nixファイルパスには、\n改行を含めることもできます。すべての空白の問題を回避するには、null区切り文字\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!!!!
4
Peter.O

注意は、指定されたパスの1GBを超えるすべてのファイルとディレクトリを削除します

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

1
Sarvesh S G

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を任意のパスに変更できます。これにより、GB単位のサイズに一致するフォルダーが出力されます。

1
Gregg Leventhal

あなたが求めているのはひどい考えです。これは主に、要求した内容がどのように機能するかによるものです。フォルダfooに1GBを超えるものが含まれている場合、fooのすべての親フォルダにもそれ以上のものが含まれます(フォルダfooが含まれているため) var] _)。

したがって、より大きなものについて_/home/myuser/myfolder/_をスキャンした場合、_/home/myuser/myfolder/bar/quz/baz/foo_は、_/home/myuser/myfolder/bar/quz/baz_、_/home/myuser/myfolder/bar/quz/_ _/home/myuser/myfolder/bar/_、および_/home/myuser/myfolder/_はすべてマークされます削除。

Duの-Sオプションでこれを回避できます。

これにより結果が得られます(実行することはお勧めしません)

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

これは、名前に改行文字を含むディレクトリでは失敗します。その欠陥がないようにそれを修正することは、読者の練習問題として残されています。

別のサイズが必要な場合は、それに一致する正規表現を作成します。 _du -b_はサイズをバイト単位で返すので、そこから作業します。ヒント:365MB以上は'^\([0-9]\{10\}\|[4-9][0-9]\{8\}\|3[7-9][0-9]\{7\}\|36[6-9][0-9]\{6\}\)'になります。

1
zebediah49

使用する du -hファイルとディレクトリのリストとそのサイズを取得します。次に、sedを使用して、消去するフォルダー名を抽出し、それらをrmに渡すことができます。これは、bashスクリプトまたは任意のシェルのコマンドとして実装できます。コマンドの記述でさらにヘルプが必要な場合は、お知らせください。上記のコマンドのmanページを読むと、タスクを完了するのに役立つはずです。

0
darnir

du -sm * | awk '$1 > 1000'を使用してフォルダを検索できます

0
user664174