
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
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
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 find
und eine Shell wie die GNU-Shell ( bash
) voraus, die Prozesssubstitution ( <(...)
) unterstützt.
Dabei wird auch davon ausgegangen, $dir
dass es nicht mit einem Prädikat beginnt -
oder nicht zufällig ein find
solches ist (wie !
, (
…).
Oben suchen wir nach Dateien, zu denen das gesamte Dateisystem $dir
gehört. Sie können $mountpoint
nur das übergeordnete Verzeichnis $dir
( .
in diesem Fall) oder das andere ersetzen.Unterverzeichnisse( 123 ABC def
hier), 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, -xdev
um sicherzustellen, dass wir nur das eine Dateisystem scannen, $dir
auf dem sie gefunden werden.
Antwort2
rm -rf foo
rm
- Dateien oder Verzeichnisse entfernen.
-f
nicht vorhandene Dateien und Argumente ignorieren, niemals nachfragen.-r
Verzeichnisse und deren Inhalte rekursiv entfernen.