Oracle Linux 6.7 -bash: /usr/bin/du: 引数リストが長すぎます

Oracle Linux 6.7 -bash: /usr/bin/du: 引数リストが長すぎます

合計サイズが 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) 実行されます。前者はfinddu多くのもっと早く。

引用ステファン・シャゼラス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

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 番目の条件のスラッシュの数は開始ディレクトリに合わせて調整され/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

逆順、つまり大きいファイルから小さいファイルの順にリストするには-rin を使用します。sort

サイズを選択するには、次の簡単なトリックをawk使用します。

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

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

関連情報