すべてのファイルとハードリンクを削除してディスク容量を確保するにはどうすればよいでしょうか?

すべてのファイルとハードリンクを削除してディスク容量を確保するにはどうすればよいでしょうか?

私は何時間もこれを理解しようとしてきましたが、どうやらできないようです

私の質問は、ファイル名がeasyで、その中に4つの異なるサブディレクトリがあるということです。 ここに画像の説明を入力してください

今、私がしなければならないことは、foo の下にあるすべて (ハード リンクを含む) を削除し、foo のすべてのディスク領域を取り戻すことです。

入力してすべてのファイルを削除しようとしました。

rm foo/*

ただし、他のサブディレクトリにあるハードリンクは削除されません。

次に、一致するinodeが

foo を検索 -type f -ls | 並べ替え

そして、このコマンドで得られた結果がこれです

ここに画像の説明を入力してください

このコマンドは他のサブディレクトリを表示せず、foo/のみを表示します。

誰か助けてください。ありがとうございます。

答え1

fooGNU ツールを使用して、降順で見つかったファイルのいずれかにハードリンクされているすべてのファイルを削除する場合は、次のようにします。

dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)

awk -v RS='\0' -v ORS='\0' '
  ARGIND == 1 {inum[$0]; next}
  {i=$0; getline}
  i in inum
 ' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i\0') \
   <(find -- "$mountpoint" -xdev ! -type d -printf '%i\0%p\0') |
  xargs -r0 rm -f

rm -rf -- "$dir"

これは、GNU df、GNU awk、GNU 、およびプロセス置換 ( ) をサポートするfindGNU シェル ( ) のようなシェルを前提としています。bash<(...)

また、$dirが で始まっていないか、が述語 ( 、... など)-ではないことも前提としています。find!(

上記では、ファイルシステム全体に属するファイルを検索します。 (この場合は)の親ディレクトリのみに$dir置き換えることも、他の$mountpoint$dir.サブディレクトリ(123 ABC defここ) すべてのハードリンクがそこにのみあることがわかっている場合。

上記のコードでは、降順で見つかったリンク数が 1 より大きいすべての非ディレクトリ ファイルの inode 番号を記録します$dir。そして、ファイル システム全体 (少なくとも他のファイル システムによってマスクされておらず、トラバースする権限があるセクション) でそれらの inode 番号を検索します。inode 番号はファイル システムごとに一意であるため、 を使用して、見つかった-xdev1 つのファイル システムのみ$dirをスキャンするようにします。

答え2

rm -rf foo

rm- ファイルまたはディレクトリを削除します。

  • -f存在しないファイルと引数を無視し、プロンプトを表示しません。
  • -rディレクトリとその内容を再帰的に削除します。

関連情報