すべてのファイルとハードリンクを削除してディスク容量を解放するには?

すべてのファイルとハードリンクを削除してディスク容量を解放するには?

この問題を解決しようと数時間努力しましたが、できないようです。

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

今やるべきことは、fooの下のすべてのアイテム(ハードリンクを含む)を削除し、fooのすべてのディスク領域を回復することです。

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

RM 金持ち/*

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

それからinodeと一致することを確認しようとしています。

fooタイプ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、GNU、およびGNUシェル()などのシェルがあるとします。awkfindbash<(...)

これはまた、$dir述部で始まらない場合、または述部で-ない場合(たとえば、...)を想定します。find!(

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

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

おすすめ記事