wired2051
Anmeldungsdatum: 28. Februar 2007
Beiträge: 2740
|
Ich habe auf einem NAS ein rsnapshot-ähnliches Backup. Nun habe ich festgestellt, dass Baloo eine inzwischen fast 4 GB grosse Datei angelegt hat ~/.local/share/baloo/email/postlist.DB. Da die Daten beim zurückspielen vom Backup vermutlich eh nur Inkonsistenz erzeugen würden, will ich ~/.local/share/baloo/ aus dem Backup löschen. Mit find -name "baloo" -mindepth 7 -maxdepth 7 -depth habe ich sie inzwischen über 30 mal gefunden. Wie lösche ich nun am besten? Trotz Lektüre des find-Wiki-Artikels bin ich unsicher, schliesslich soll das Backup mit seinen Links nicht kaputt gehen: | find -name "baloo" -mindepth 7 -maxdepth 7 -delete
|
oder | find -name "baloo" -mindepth 7 -maxdepth 7 -depth -exec rm -rf {} \;
|
–-edit-– Imho ist das eine Linux–Syntax Frage und hat nur zufällig was mit einem Backup zu tun aber egal, solange sie von Leuten gelesen wird, die was davon verstehen... Moderiert von XM-Franz: Thema in einen passenderen Forenbereich verschoben.
Moderiert von tomtomtom: Thema in einen noch passenderen Forenbereich verschoben. 😇
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Wenn Du sicher bist, dass diese baloo- Dateien immer nur in der 7. Verzeichnisebene vorkommen, könntest Du es auch ganz ohne find machen, nur mit einer Datei- Expansion: echo */*/*/*/*/*/baloo # zum testen
rm */*/*/*/*/*/baloo # zum löschen LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
track schrieb: Wenn Du sicher bist, dass diese baloo- Dateien immer nur in der 7. Verzeichnisebene vorkommen, könntest Du es auch ganz ohne find machen, nur mit einer Datei- Expansion: echo */*/*/*/*/*/baloo # zum testen
rm */*/*/*/*/*/baloo # zum löschen
Für den Verzeichnisbaum fehlt da noch das "-rf": Wenn man noch etwas mehr Sicherheit einbauen will, dann kann man das auch so machen | for d in */*/*/*/*/*/baloo; do
test -d "$d" -a -f "$d/email/postlist.DB" && rm -rf "$d"
done
|
Man könnte noch ein wenig mit find und xargs spielen: | find woauchimmer -depth -type f -name postlist.DB -printf '%h\0' \
| xargs -r0 -I {} rm -rf {}/..
|
😛 Zum Testen "rm -rf" ersetzen durch "readlink -f". Ciao robert
|
wired2051
(Themenstarter)
Anmeldungsdatum: 28. Februar 2007
Beiträge: 2740
|
tomtomtom Vielen Dank. 👍 track schrieb: echo */*/*/*/*/*/baloo # zum testen
...findet leider nichts. rklm schrieb: Man könnte noch ein wenig mit find und xargs spielen: | find woauchimmer -depth -type f -name postlist.DB -printf '%h\0' \
| xargs -r0 -I {} rm -rf {}/..
|
xargs kenne ich nicht und die manpage bringt mich nicht weiter. 😳 Ausserdem will ich nicht nur die Datei postlist.DB sondern das ganze Verzeichnis baloo löschen, denn das Rückspielen vom Backup dürfte sowieso nicht funktionieren. finde funktioniert ja schon mal | DS209> find -name "baloo" -mindepth 7 -maxdepth 7 -depth
./20150109-1030/PC/home/USER/.local/share/baloo
./20150113-1030/PC/home/USER/.local/share/baloo
./20141110-1030/PC/home/USER/.local/share/baloo
|
die Frage ist nun, wie geschickt löschen. Ausserdem mache ich ich mir wegen der Hardlinks im Backup Sorgen. Habe ich das richtig verstanden, dass bei Hardlinks die Original-Datei erst gelöscht wird, wenn der letzte Hardlink gelöscht wurde oder muss man doch nach Datum absteigend löschen?
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
wired2051 schrieb: echo */*/*/*/*/*/baloo # zum testen
...findet leider nichts.
Nun ja, anscheinend hatte ich einen Stern zu viel oder zu wenig geschrieben ... echo */*/*/*/*/baloo # zum testen
echo /*/*/*/*/*/*/*/baloo # oder so
(Du sollst ja eigentlich auch nicht nur blind abschreiben, sondern die Befehle selber nachvollziehen. 😉 ) Zum rekursiven Löschen hat Robert oben ja schon was geschrieben. LG, track
|
wired2051
(Themenstarter)
Anmeldungsdatum: 28. Februar 2007
Beiträge: 2740
|
track schrieb: Nun ja, anscheinend hatte ich einen Stern zu viel oder zu wenig geschrieben ... echo */*/*/*/*/baloo # zum testen
echo /*/*/*/*/*/*/*/baloo # oder so
Ich hatte gezählt und die Anzahl für richtig befunden. track schrieb: (Du sollst ja eigentlich auch nicht nur blind abschreiben, sondern die Befehle selber nachvollziehen. 😉 )
Tu ich auch nicht, wenn ich kann, deshalb habe ich es mit echo */*/*/*/*/*/*/baloo (ohne führendes '/', weil ab aktueller Position und nicht ab / gesucht werden soll) noch einmal versucht - wieder erfolglos. Aber das finden ist ja auch gar nicht das Problem. track schrieb: Zum rekursiven Löschen hat Robert oben ja schon was geschrieben.
Also ist find -name "baloo" -mindepth 7 -maxdepth 7 -depth -exec rm -rf {} \; tatsächlich in Ordnung (ich bin kein Shell-Auskenner!)?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
wired2051 schrieb:
rklm schrieb: Man könnte noch ein wenig mit find und xargs spielen: | find woauchimmer -depth -type f -name postlist.DB -printf '%h\0' \
| xargs -r0 -I {} rm -rf {}/..
|
xargs kenne ich nicht und die manpage bringt mich nicht weiter. 😳
Was ist Dir nicht klar?
Ausserdem will ich nicht nur die Datei postlist.DB sondern das ganze Verzeichnis baloo löschen, denn das Rückspielen vom Backup dürfte sowieso nicht funktionieren.
Das ist aber genau das, was der Zweizeiler macht: er sucht alle Vorkommen von "postlist.DB", gibt deren Ordner aus und löscht dann dessen Elternordner rekursiv.
Ausserdem mache ich ich mir wegen der Hardlinks im Backup Sorgen. Habe ich das richtig verstanden, dass bei Hardlinks die Original-Datei erst gelöscht wird, wenn der letzte Hardlink gelöscht wurde oder muss man doch nach Datum absteigend löschen?
Ersteres. Ciao robert
|
wired2051
(Themenstarter)
Anmeldungsdatum: 28. Februar 2007
Beiträge: 2740
|
rklm schrieb: wired2051 schrieb: xargs kenne ich nicht und die manpage bringt mich nicht weiter. 😳
Was ist Dir nicht klar?
Es geht damit los, dass ich nicht verstehe, warum es zwei Zeilen sind. Muss ich also ein Script erstellen? Was meinst Du mit "woauchimmer", soll das das Wurzelverzeichnis des Backups sein? Und die Zeichenfolgen
'%h\0' \' und -r0 -I {} und {}/.. erschliessen sich mir auch nicht. 😳 rklm schrieb: Das ist aber genau das, was der Zweizeiler macht: er sucht alle Vorkommen von "postlist.DB", gibt deren Ordner aus und löscht dann dessen Elternordner rekursiv.
Klingt gut aber, wenn ich ehrlich bin, fehlt mir die Schritt-für-Schritt-Anleitung. Und wie kann ich das testen ohne rm -rf auszuführen?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
wired2051 schrieb: rklm schrieb: wired2051 schrieb: xargs kenne ich nicht und die manpage bringt mich nicht weiter. 😳
Was ist Dir nicht klar?
Es geht damit los, dass ich nicht verstehe, warum es zwei Zeilen sind.
Das hat aber nix mit xargs zu tun. Es liest sich einfach besser. Hast Du denn mal den Shell/Bash-Skripting-Guide für Anfänger studiert?
Muss ich also ein Script erstellen? Was meinst Du mit "woauchimmer", soll das das Wurzelverzeichnis des Backups sein?
Wo auch immer Du suchen willst. So viel solltest Du doch schon mitbekommen haben, dass die ersten Argumente die Verzeichnisse sind, in denen die Suche beginnt. Immerhin hast Du ja selbst find hier im Thema eingeführt.
Und die Zeichenfolgen
'%h\0' \' und -r0 -I {} und {}/.. erschliessen sich mir auch nicht. 😳
▶ Manpage von find und xargs
rklm schrieb: Das ist aber genau das, was der Zweizeiler macht: er sucht alle Vorkommen von "postlist.DB", gibt deren Ordner aus und löscht dann dessen Elternordner rekursiv.
Klingt gut aber, wenn ich ehrlich bin, fehlt mir die Schritt-für-Schritt-Anleitung.
Es ist erlaubt, auch mal selbst in der Doku zu stöbern. 😛 Schau doch mal in die genannten Manpages.
Und wie kann ich das testen ohne rm -rf auszuführen?
echo ist Dein Freund - füge es einfach vor dem rm ein. Bis dann robert
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Vielleicht verstehst du es auch mit den Erklärungen in unserem Wiki etwas besser: xargs. Hab da mal noch -I eingefügt, wollte ich schon mal. Da laut Manpage -i veraltet ist. Ansonsten schau dir da doch einfach mal die Beispiele an. Mit ungefährlicheren Beispielen wie echo statt rm kannst du sie auch ausprobieren und verändern. Und es ist ja noch kein Meister vom Himmel gefallen. Wer weiß, wo er die find-Befehle gefunden hat. Er hat auch schon gut zu rsync usw. im Wiki geholfen. Solche Syntax und auch das Benutzen von man erschließt sich nicht gleich jedem - und gerade die Klammern sehen schon etwas komisch für Anfänger aus. Beim ersten Gebrauch fand ich sie auch etwas komisch und musste mich erst vergewissern, durch Ausprobieren, ob sie das machen, was ich mir drunter vorstelle. 😉 Also lass dir Zeit und vielleicht findest du den Zugang zu manchen Manpages noch. Grüße, Benno
|
wired2051
(Themenstarter)
Anmeldungsdatum: 28. Februar 2007
Beiträge: 2740
|
Nein, den Bash-Skripting-Guide für Anfänger kannte ich nicht. Danke für den Link, ich habe ihn bis Variablen – Teil 2 gelesen, dann wurde mir schwindelig. 😳 Den Pipeoperator kannte ich schon aber die Nutzung von '|' in den zwei Zeilen von rklm erschliesst sich mir trotzdem nicht. Auch verstehe ich nicht, was mit den beiden \ maskiert wird. Und was %h und -r0 machen, verstehe ich auch durch die Wiki-Seite zu xargs nicht. Ich scheitere doch schon daran zu verstehen wie man zwei Zeilen ohne Script ausführt. 😳 Benno-007 schrieb: Und es ist ja noch kein Meister vom Himmel gefallen. Wer weiß, wo er die find-Befehle gefunden hat.
Das weiss ich leider auch nicht mehr, sonst hätte ich -delete benutzt und hier nicht gefragt. 🙄 So aber bin ich durch meine eigene Notize rm -rf {} \; verwirrt. remove --recursive --force ist klar und {} steht für das Ergebnis von find aber wozu am Ende das Semikolon und warum wird es maskiert? Und warum ist rm -rf {} \; besser als -delete?
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Bei find werden bei {} die gefundenen Treffer eingesetzt. Ohne entsprechende Zeichen am Abschluss funktioniert es schlicht nicht, du bekommst eine Fehlermeldung. Maskiert wird es, damit es die Shell nicht sieht - denn sie würde es auswerten. Es soll aber find sehen und es auswerten. Das ist funktional ein Unterschied. Nimm das als EINFACHE Erklärung mal so hin, weil mehr Details machen es, glaube ich, noch komplizierter als einfacher. 😉 Genauso ist es bei den anderen "\" - die Shell (Bash) darf es nicht "sehen"/ auswerten!
Und was %h und -r0 machen, verstehe ich auch durch die Wiki-Seite zu xargs nicht.
Aber das andere mit dem -I usw. ist da erklärt. Deine Zeichenfolgen guckst du so nach:
man xargs
Dort drin eingeben:
/-r
Und dann Enter und drei mal n drücken! Dann kommst du zum Suchtreffer: --no-run-if-empty
-r If the standard input does not contain any nonblanks, do not run the command. Normally, the command is run
once even if there is no input. This option is a GNU extension.
Warum genau, warum r0 und warum %h, das könntet ihr ihm/ uns ja mal noch bitte erklären. 😇 Grüße, Benno Edit: Das %h war ja von find - und da findest du mit der selben Suchfunktion wie eben bei xargs:
%h voranstehende Verzeichnisse des Dateinamens (alles außer dem letzten Element). Falls der Dateiname keine
Schrägstriche enthält (da er im aktuellen Verzeichnis ist), wird der Bezeichner %h zu ».« expandiert.
Sogar auf Deutsch. Lies hauptsächlich den ersten Satz - das reicht zum Verständnis. Sollte nun klarer werden. Also: /ordner/unterorder/datei wird dadurch zu - na? Sag es uns. 😉
|
Berlin_1946
Supporter, Wikiteam
Anmeldungsdatum: 18. September 2009
Beiträge: 8686
|
Hallo. wired2051 schrieb: Den Pipeoperator kannte ich schon aber die Nutzung von '|' in den zwei Zeilen von rklm erschliesst sich mir trotzdem nicht.
]
Hier im xargs findes du die Erklärung zu deiner Frage.
|
wired2051
(Themenstarter)
Anmeldungsdatum: 28. Februar 2007
Beiträge: 2740
|
Benno-007 schrieb: Nimm das als EINFACHE Erklärung mal so hin, weil mehr Details machen es, glaube ich, noch komplizierter als einfacher. 😉
Vielen Dank! 😀 Benno-007 schrieb: --no-run-if-empty
-r If the standard input does not contain any nonblanks, do not run the command. Normally, the command is run
once even if there is no input. This option is a GNU extension.
Das habe ich gelesen aber rklm hat -r0 verwendet und das ist doch was anderes oder irre ich mich? Benno-007 schrieb: Edit: Das %h war ja von find - und da findest du mit der selben Suchfunktion wie eben bei xargs:
%h voranstehende Verzeichnisse des Dateinamens (alles außer dem letzten Element). Falls der Dateiname keine
Schrägstriche enthält (da er im aktuellen Verzeichnis ist), wird der Bezeichner %h zu ».« expandiert.
OK, das habe ich übersehen. 😳 Aber rklm hat %h mit maskierter 0 verwendet, warum? Berlin 1946 schrieb: Hier im xargs findes du die Erklärung zu deiner Frage.
Dort wird | so verwendet, wie ich es kenne, zur Übergabe des Ergebnisses z. B. von find an xargs. In rklms Zweizeiler beginnt die zweite Zeile mit | und das verstehe ich nach wie vor nicht. 🙄 Zur Erinnerung: rklm schrieb: | find woauchimmer -depth -type f -name postlist.DB -printf '%h\0' \
| xargs -r0 -I {} rm -rf {}/..
|
...und mich würde weiterhin interessieren, was der Unterschied zwischen -delete und -exec rm -rf {} \; ist (vergl. mein erstes Posting hier)?
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5334
|
wired2051 schrieb: Benno-007 schrieb:
OK, das habe ich übersehen. 😳 Aber rklm hat %h mit maskierter 0 verwendet, warum?
Das ist eine ASCII-Null, also keine Zahl, sondern ein Zeichen, das das Ende eines Strings markiert. Steht auch in der Manpage von find bei printf. Warum das hier noetig ist, weiss ich aber auch nicht.
Berlin 1946 schrieb: Hier im xargs findes du die Erklärung zu deiner Frage.
Dort wird | so verwendet, wie ich es kenne, zur Übergabe des Ergebnisses z. B. von find an xargs. In rklms Zweizeiler beginnt die zweite Zeile mit | und das verstehe ich nach wie vor nicht. 🙄
Das Befehlt ist eh nur eine Zeile, aber rklm teilt ihn in 2 Zeilen auf. Deshalb ist am Ende der Ersten Zeile ein Backslash, das den Zeilenumbruch "maskiert". Du kannst einfach den Backslash und den Zeilenumbruch (aka newline) einfach loeschen, dann siehts gewohnter aus.
|