xargsは複数のコマンドを実行しますか?

xargsは複数のコマンドを実行しますか?

を使用してxargs複数のコマンドを実行できますか?私が見つけた唯一の関連情報質問は〜です。しかし、答えはとは関係ありませんxargs

私は簡単に運営しています。

du / -ah | sort -r -n | head -n 10 |  awk '{print $2}'

最も多くのディスク領域を占めるファイルを見つけます。ただし、削除したいディレクトリも返されます。文書任意の構造を維持するには。

findファイルサイズの代わりにディスク使用量で検索できるかどうかわからないため、コマンドの使用に疲れました。

どんなアドバイスもありがとうございました!

答え1

find通常のファイルをインポートして実行するために使用できますdu。以下のコマンドは、ルートディレクトリでこれを実行すると、一部の特殊ディレクトリに関する苦情が発生する可能性があるため、標準エラーを抑制します。ここでは、およびに-h使用され、ファイルサイズの表示をソートするのに役立ちます。dusort

find / -type f -exec du -h {} + 2>/dev/null | sort -hr | head | cut -f2-

改行文字は、上記のコマンドのファイル区切り文字としても使用されます。 GNUシェルに入る安全な方法は、nullバイトを使用して引数を区切ることです。たとえば、次のようになります。

find / -type f -exec du -h0 {} + 2>/dev/null | sort -zhr | head -z | cut -zf2- | xargs -r0 <some command to run for the 10 biggest files>

あなたの場合(/すべてのユーザーとして検索)、ファイルとサイズを印刷して実行する操作を決定します。結果をに直接送信しないでくださいrm --

また見なさい:

答え2

目次多くのタイプの一つです文書(一般、ディレクトリ、シンボリックリンク、fifo、デバイス...)。おそらくあなたは一般ファイルこれは、ディスク領域が割り当てられるディレクトリとは異なる種類のファイルであるためです。

du / -ah | head -n 10 | sort -r -n | awk '{print $2}'

-hを使用すると、KMGT... サフィックスが発生するため、間違っています。これはsort -n機能しないことを意味します。 GNU実装にはこれらのサフィックスをデコードするオプションがsortあります-hが、丸めのために順序が間違っている可能性があります。

さらに、ハードリンクは一度だけ評価され、ファイルパスにはテキストではなく改行を含めることができます。awk2番目のスペースで区切られたフィールドを返すと、スペースを含むファイルパスがブロックされることは言うまでもありません。 0はファイルパスには現れない唯一のバイト値なので、NULで区切られたレコードを使用してファイルのリストを表示しようとしています。

-hGNU拡張です。 GNU実装はfindディスク使用量を使用または報告できるため、次のことができます。-printf %b-printf %k

find . -type f -printf '%b\t%p\0' |
  sort -zrn |
  numfmt -d $'\t' -z --to=iec --from-unit=512 |
  tr '\0' '\n'

これはtr人が消費できるように出力するものなので、このリストを後処理するには NUL で区切られた形式を維持する必要があります。たとえば、ディスク使用量の観点から最大10個のファイルを削除するには、次のようにします。

find . -type f -printf '%b\t%p\0' |
  sort -zrn |
  head -zn10 |
  cut -zf 2- |
  xargs -r0 rm -f

-printf、、、-zはすべてGNU拡張ですが、-r現在他のいくつかの実装でもサポートされており、それほど少ないです)。-0xargs -0-r

技術的には、rm親ディレクトリからファイルのリンクを解除してください。パイプラインが10の異なるディレクトリにリンクされている同じファイルを返す場合、そのファイルのリンクを解除できますが、ファイルがまだより多くのディレクトリに接続されている場合は、そのスペースを回復できません。

.上位10個の最大ファイルの下のディレクトリにあるすべてのエントリ(リンク)を削除するには、次の手順を実行します。

find . -type f -printf '%b\t%D:%i\t%p\0' |
  sort -zrn |
  gawk -F'\t' -v RS='\0' -v ORS='\0' '!seen[$2]++ && ++n > 10 {exit}1' |
  cut -zf 3- |
  xargs -r0 rm -f

¹ 次の種類のファイルの場合目次は、duディレクトリファイル自体のディスク使用量だけでなく、リストに記載されている一意のファイルとその反復サブディレクトリのディスク使用量も報告します。

関連情報