Wie kann ich durch Entfernen aller Dateien und Hardlinks Speicherplatz beanspruchen?

Wie kann ich durch Entfernen aller Dateien und Hardlinks Speicherplatz beanspruchen?

Ich versuche schon seit Stunden, das herauszufinden, aber es scheint nicht zu funktionieren

Meine Frage ist, ich habe einen Dateinamen einfach und es gibt 4 verschiedene Unterverzeichnisse darin Bildbeschreibung hier eingeben

jetzt muss ich alles unter foo löschen (einschließlich Hardlinks) und den gesamten Speicherplatz von foo zurückfordern.

Ich habe versucht, die gesamte Datei durch Eintippen zu entfernen.

rm foo/*

Die Hardlinks in den anderen Unterverzeichnissen werden dadurch jedoch nicht entfernt.

Dann habe ich versucht zu sehen, ob die Matching Inodes

finde foo -typ f -ls | sortiere

und das habe ich mit diesem Befehl bekommen

Bildbeschreibung hier eingeben

dieser Befehl zeigt nicht die anderen Unterverzeichnisse an, nur foo/

kann mir bitte jemand helfen. Danke.

Antwort1

Wenn Sie alle Dateien löschen möchten, die mit einer der per Abstieg gefundenen Dateien fest verknüpft sind foo, können Sie mit GNU-Tools Folgendes tun:

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"

Dies setzt GNU df, GNU awk, GNU findund eine Shell wie die GNU-Shell ( bash) voraus, die Prozesssubstitution ( <(...)) unterstützt.

Dabei wird auch davon ausgegangen, $dirdass es nicht mit einem Prädikat beginnt -oder nicht zufällig ein findsolches ist (wie !, (…).

Oben suchen wir nach Dateien, zu denen das gesamte Dateisystem $dirgehört. Sie können $mountpointnur das übergeordnete Verzeichnis $dir( .in diesem Fall) oder das andere ersetzen.Unterverzeichnisse( 123 ABC defhier), wenn Sie alle Hardlinks kennen, die nur dort enthalten sind.

Im obigen Code zeichnen wir die Inode-Nummern aller Nicht-Verzeichnisdateien mit einer Linkanzahl größer als 1 auf, die durch absteigendes Suchen gefunden werden $dir. Und suchen Sie im gesamten Dateisystem nach diesen Inode-Nummern (zumindest in den Abschnitten, die nicht von anderen Dateisystemen maskiert sind und für die Sie die Berechtigung zum Durchlaufen haben). Inode-Nummern sind nur pro Dateisystem eindeutig, daher verwenden wir, -xdevum sicherzustellen, dass wir nur das eine Dateisystem scannen, $dirauf dem sie gefunden werden.

Antwort2

rm -rf foo

rm- Dateien oder Verzeichnisse entfernen.

  • -fnicht vorhandene Dateien und Argumente ignorieren, niemals nachfragen.
  • -rVerzeichnisse und deren Inhalte rekursiv entfernen.

verwandte Informationen