
この問題を解決しようと数時間努力しましたが、できないようです。
私の問題は、私のファイル名が単純で、その中に4つの異なるサブディレクトリがあることです。
今やるべきことは、fooの下のすべてのアイテム(ハードリンクを含む)を削除し、fooのすべてのディスク領域を回復することです。
入力してすべてのファイルを削除してみました。
RM 金持ち/*
ただし、他のサブディレクトリのハードリンクは削除されません。
それからinodeと一致することを確認しようとしています。
fooタイプf -lsタイプを探す|
これが私がこのコマンドで得るものです
このコマンドは、他のサブディレクトリを表示せずにfoo /のみを表示します。
誰でも私を助けることができますか?ありがとうございます。
答え1
foo
GNUツールを使用して降順で見つかったファイルにハードリンクされているすべてのファイルを削除するには、次の手順を実行します。
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シェル()などのシェルがあるとします。awk
find
bash
<(...)
これはまた、$dir
述部で始まらない場合、または述部で-
ない場合(たとえば、...)を想定します。find
!
(
上記では、ファイルが属する$dir
ファイルシステム全体を検索します。 (この場合)$mountpoint
親ディレクトリまたは他のディレクトリを次のように置き換えることができます。$dir
.
サブディレクトリ(123 ABC def
ここ)すべてのハードリンクがそこにのみあることを知っている場合。
上記のコードは、リンク数が1より大きい降順で見つかったすべての非ディレクトリファイルのinode番号を記録します$dir
。そして、ファイルシステム全体で対応するinode番号を探します(少なくとも他のファイルシステムによって隠されておらず、ナビゲーション権限がある部分)。 inode 番号はファイルシステムごとに一意であるため、見つかった 1 つのファイルシステムのみをスキャンできるようにします-xdev
。$dir
答え2
rm -rf foo
rm
- ファイルまたはディレクトリを削除します。
-f
存在しないファイルとパラメータを無視し、メッセージを表示しません。-r
ディレクトリとその内容を繰り返し削除します。