合計サイズが 300 GB の約 100 万個のフォルダーのパスがあります。du -sh *
コマンドを実行すると、タイトルで述べたエラーが発生します。xargs
このコマンドと組み合わせて使用すれば、xargs
問題が解決しますか? ただし、同じパスで 20 GB を超えるフォルダーを検索するには、別のコマンドが必要です。これら 2 つのコマンドの使用方法についてサポートが必要です。
パスの例:/data/dataold/exports/
出力は以下のようになるはずです (以下で述べたものは、上記の行で指定したメイン パスの下のファイル名とフォルダー名と考えることができます)。
4.0K xyz.sh 12K asdasda.txt 10G QWERT 1G ASDFGH
よろしくお願いします。
答え1
1 つのオプションは を使用することですfind
が、以下に示す他の解決策のいずれかをお勧めします。
find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \;
/data/dataold/exports
サブディレクトリが含まれていると仮定すると
foo
bar
baz
(そしておそらくそれ以上)
du -sh /data/dataold/exports/foo
du -sh /data/dataold/exports/bar
du -sh /data/dataold/exports/baz
等
オプションは、に対してコマンドの-mindepth
実行を回避し、サブディレクトリのサブディレクトリに対してこれを回避します (例: の場合) 。du
/data/dataold/exports
-maxdepth
/data/dataold/exports/foo/something
で示唆されているようにカス'コメントでは、
find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \+
... -exec du -sh {} \;
のバージョンがこれをサポートしている場合、の代わりにを使用しますfind
。+
の代わりにを使用すると;
、ファイル/ディレクトリごとに を実行するのではなく、Linux の引数バッファがいっぱいになるたびに (約 2MB) 実行されます。前者はfind
du
多くのもっと早く。
引用ステファン・シャゼラスdu
' コメント: " ( の場合と同様に)を複数回独立して呼び出すと、find -exec
それらのトップレベル ディレクトリ間にハード リンクがある場合、異なる番号が返される可能性があることに注意してください。これは、 を複数回呼び出して見つかった場合、重複が排除されないためですdu
。"
GNU では、オプションまたはをdu
使用して表示される深さを制限できます。-d
--max-depth=N
du -h -d 1 /data/dataold/exports
これはすべてのサブディレクトリの計算を行いますが、出力は開始点から1つ下の深さに制限されます。したがって、上記の例では、合計サイズが出力されます。
/data/dataold/exports/foo
/data/dataold/exports/bar
/data/dataold/exports/baz
などなど
/data/dataold/exports
du
2 番目の解決策が利用可能な場合は、サブディレクトリごとに ( の場合)、または引数バッファを埋め尽くすサブディレクトリのセットごとに ( の場合) 、新しいプロセスを開始する必要がないため、こちらを-exec ... \;
優先する必要があります-exec ... \+
。
のバージョンがdu
オプションをサポートしていない場合は-d
、
du -h /data/dataold/exports
出力をフィルタリングして、サブディレクトリの最初のレベル以下のすべてを削除します。
数値比較で出力をフィルタリングしたい場合は、オプションを省略することをお勧めします-h
。フィルタリングをテストしている間に遅いファイルシステムアクセスを待たないようにするには、出力をファイルにリダイレクトすることをお勧めします。例:
du -d 1 /data/dataold/exports > outputfile
または
du -d 1 /data/dataold/exports 2>errors | tee outputfile
後で内容を処理しますoutputfile
。
例:
awk '$1 > 20e9` outputfile
du
オプションがサポートされていない場合は、-d
次のようなものを使用できます。
du /data/dataold/exports > outputfile
awk '$1 > 20e9 && $1 != /\/.*\/.*\/.*\/.*\/.*/` outputfile
これにより、最初のフィールドに 20 * 10^9 より大きい数値があり、2 番目のフィールドに 5 個 (またはそれ以上) のスラッシュを含まない値を持つすべての行が出力されます。2 番目の条件のスラッシュの数は開始ディレクトリに合わせて調整され/data/dataold/exports
、 eg は出力されます/data/dataold/exports/foo
が、 eg は出力されません/data/dataold/exports/foo/bar
。
答え2
要約せずにdu
作業を進めてください。umanオーダーsort
で申請し、特定のサイズで上限を設定します。-h
du -h /data/dataold/exports/ | sort -h
逆順、つまり大きいファイルから小さいファイルの順にリストするには-r
in を使用します。sort
サイズを選択するには、次の簡単なトリックをawk
使用します。
du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h
つまり、G
フィールド区切り文字として (GB サイズの出力から) を使用し、フィールドが数字のみであるかどうかを確認し (G 区切り文字との誤った一致を除外するため)、20 より大きい数字のみを選択します。ここでの並べ替えはオプションです。