
私は何時間もこれを理解しようとしてきましたが、どうやらできないようです
私の質問は、ファイル名がeasyで、その中に4つの異なるサブディレクトリがあるということです。
今、私がしなければならないことは、foo の下にあるすべて (ハード リンクを含む) を削除し、foo のすべてのディスク領域を取り戻すことです。
入力してすべてのファイルを削除しようとしました。
rm foo/*
ただし、他のサブディレクトリにあるハードリンクは削除されません。
次に、一致するinodeが
foo を検索 -type 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 awk
、GNU 、およびプロセス置換 ( ) をサポートするfind
GNU シェル ( ) のようなシェルを前提としています。bash
<(...)
また、$dir
が で始まっていないか、が述語 ( 、... など)-
ではないことも前提としています。find
!
(
上記では、ファイルシステム全体に属するファイルを検索します。 (この場合は)の親ディレクトリのみに$dir
置き換えることも、他の$mountpoint
$dir
.
サブディレクトリ(123 ABC def
ここ) すべてのハードリンクがそこにのみあることがわかっている場合。
上記のコードでは、降順で見つかったリンク数が 1 より大きいすべての非ディレクトリ ファイルの inode 番号を記録します$dir
。そして、ファイル システム全体 (少なくとも他のファイル システムによってマスクされておらず、トラバースする権限があるセクション) でそれらの inode 番号を検索します。inode 番号はファイル システムごとに一意であるため、 を使用して、見つかった-xdev
1 つのファイル システムのみ$dir
をスキャンするようにします。
答え2
rm -rf foo
rm
- ファイルまたはディレクトリを削除します。
-f
存在しないファイルと引数を無視し、プロンプトを表示しません。-r
ディレクトリとその内容を再帰的に削除します。