Oracle Linux 6.7 -bash: /usr/bin/du: パラメータのリストが長すぎます。

Oracle Linux 6.7 -bash: /usr/bin/du: パラメータのリストが長すぎます。

合計サイズが300GBの約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以下に示す他の解決策の1つを使用することをお勧めします。

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実行を防ぎ、サブディレクトリのサブディレクトリからのforなどのコマンドの実行を防ぎます。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この機能をサポートしている場合。+代わりに、ファイル/ディレクトリごとに1回ではなく、;バッファがいっぱいになるたびに(約2MB)、Linux引数バッファが1回実行されます。前者はfindduたくさん急いで。

引用するスティーブン・チャジェラス' 注: 「これらの最上位ディレクトリ間にハードリンクがある場合は、複数の独立した呼び出しdu(たとえば、データ重複排除の実行) を呼び出します。find -execdu


duGNUを使用すると、次のオプションを使用して表示する深さを制限できます。-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

du2番目のソリューション(利用可能な場合)を推奨する必要があります。これは、パラメータバッファを埋めるために各サブディレクトリ(の場合)または各サブディレクトリのセットに対して新しいプロセスを開始する必要がないためです-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番目の条件のスラッシュ数は開始ディレクトリに従ってカスタマイズされ、egは/data/dataold/exports印刷されますが、/data/dataold/exports/fooegは印刷されません/data/dataold/exports/foo/bar

答え2

要約せずにdu作業が完了するようにしてください。sortユーザーの注文ごとに適用し、-h特定のサイズに制限します。

du -h /data/dataold/exports/ | sort -h

最大から最小までの順番で-rファイルを一覧表示するために使用されます。sort

サイズを選択するには、次awkの簡単な方法を使用できます。

du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h 

つまり、GGBサイズの出力でフィールド区切り文字として使用し、フィールドに数字のみがあることを確認してから(G区切り文字と間違った一致を除外するため)、20より大きい数字のみを選択します。ここでソートするのはオプションです。

関連情報