Dateien mit "?" lassen sich nicht löschen

brenner

Commander
Registriert
Apr. 2002
Beiträge
3.037
Leider ist eines meiner Haussteuerungscripte schief gelaufen. Über die Monate wurden im /root) knapp 1 Millionen Dateien abgelegt bis die inodes voll waren. Fast alles ließ sich löschen, nur die Dateien mit dem Fragezeichen nicht, egal ob über Putty oder WinSCP. Es gibt auch keine Fehlermeldungen beim löschen, die Dateien bleiben einfach da. Jemand eine Idee?

Danke!
Unbenannt.JPG
 
Die Dateien haben Zeichen, die das Terminal offenbar nicht darstellen kann (das "?" in "?cklauf").
Printet find überhaupt irgendein File?
Was passiert, wenn du mal versuchst, eine einzelne Datei zu löschen mit rm -- '<filename>'? Funktioniert das?
 
Unter Linux kann man mit dem Backslash \ Sonderzeichen entwerten. Also mal testweise an den entsprechenden Stellen einen einfügen und testen.
Da ich kein Linux Experte bin folgender Befehl nur unter Vorbehalt und auf eigenes Risiko, keine Ahnung ob der stimmt.

rm statechange.cgi\?ise_id=6421&new_value=\?*
 
Zuletzt bearbeitet:
Du kannst dir auch mit ls und passendem Parameter die inode Nummer anzeigen lassen und dann mit rm und passendem Parameter den Eintrag direkt daraus löschen... Damit umgehst du alle Namensbeschränkungen die deine shell hat
 
  • Gefällt mir
Reaktionen: HisN
Rücklauf als Dateiname war wohl keine gute Idee :-)
 
nullPtr schrieb:
Die Dateien haben Zeichen, die das Terminal offenbar nicht darstellen kann (das "?" in "?cklauf").
Printet find überhaupt irgendein File?
Ich denke es liegt weniger daran, dass das Zeichen nicht dargestellt werden könnte, sondern eher daran, dass es ein Kodierungsproblem gibt.
 
@HisN :
Das die Dateien überhaupt entstehen war nicht beabsichtigt. Da läuft was mit dem wget im Script schief.


Ich habe es bisher nicht geschafft die übrigen 38.000 Dateien zu löschen. Was geht ist im WinSCP eine Dateien umzubennnen und dann zu löschen.

Ich weiss nur noch nicht wie ich das scripten kann.

Der Löschbefehl funktioniert super weil er bei den 1 Millionen dateien am schnellsten war.

find /root -name "statechange.cgi*" -delete -print

Vielleicht kann ich den auch zum umbennen und dann löschen nehmen?
 
das ist übrigens ein Verhalten deiner Shell, nicht von Linux selbst :)

geht denn folgendes:

ls -li statechange*

dann die erste Zahl merken z.B.

root@hs:/tmp/test2# ls -li statechange*
1962397 -rw-r--r-- 1 root root 0 Apr 7 10:41 'statechange.cgi?ise_id=1234&new_value=?cklauf_SOLL.9999'


und dann

find . -inum 1962397 -exec rm {} \;

naja, und nun musst du da nur noch irgendwie ne Schleife bauen der dir alle löscht.

(btw: meine Bash Version 4.4.19(1)-release kann die Dateien auch so löschen, also mit einem einfachen rm ... du siehst z.B. auch dass bei einem ls der Dateiname in einfachen Hochkomma ausgegeben wird sobald er Sonderzeichen enthält)
 
Bei ihm scheitert in Beitrag #10 das execve(2) des ls-Kommandos in der bash wegen der zu langen Parameterliste durch die Expansion des *. In Voreinstellung sind (bei mir hier) "nur" 2 MB Parameter möglich. Der * expandiert seine 1 Mio Dateinamen hintereinander ... was weit länger ist.

Also nicht erst den * expandieren und execve über alles auf einmal anwerfen sondern über die einzelnen Filenamen iterieren und einzeln (oder in kleineren Gruppen) löschen. Ungetestet, aber sollte dank xargs noch halbwegs performen. Ein reines find .... -exec wäre ziemlich lahm bei den vielen Files.

find . -type f -name "statechange*" -print0 | xargs -0 rm

/edit:
(das löscht auch in Unterverzeichnissen, falls vorhanden ... dem find noch -maxdepth 1 mitgeben, wenn das ein Problem ist)

... und zu dem ? und anderen Sonderzeichen in der Shell: Lies in "man bash" die Abschnitte "Pattern Matching" um die Bedeutung von ? zu erfahren und "QUOTING" um zu erfahren, wie du die Sonderfunktion des ? aufheben kannst.
 
Zuletzt bearbeitet:
Danke für die Antwort.

Wie im ersten Beitrag geschrieben war das löschen der fast 1 Million Dateien kein Problem. Ich habe dafür
Code:
find /root -name "statechange.cgi*" -delete -print
verwendet.


Probleme machen immer noch die ca. 38.000 Dateien mit dem "unbekannten" Zeichen, die bekomme ich einfach nicht weg.
 
es gibt aber einen Unterschied zwischen den zwei Befehlen ... einmal löscht das "find" die Datei (oder versucht es) und beim anderen übergibst du den Pfad an "rm"

wenn nix mehr hilft per USB Stick ein aktuelles Ubuntu booten, Partition mounten, und dort löschen
 
Hast Du eigentlich schon das versucht, was ich weiter oben geschrieben habe, die ungültigen Zeichen zu entwerten?
 
PatrickS3 schrieb:
Hast Du eigentlich schon das versucht, was ich weiter oben geschrieben habe, die ungültigen Zeichen zu entwerten?


Jepp:

Code:
root@cacti04:~# rm statechange.cgi?ise_id=6421&new_value=\?*
[1] 22688
root@cacti04:~# rm: Entfernen von „statechange.cgi?ise_id=6421“ nicht möglich: Datei oder Verzeichnis nicht gefunden
 
Und wenn Du bei dem ersten Fragezeichen auch den \ setzt? So wie in meinem Beispiel oben.
rm statechange.cgi\?ise_id=6421&new_value=\?*
 
Das Suchergebnis muss literal gelöscht werden.
Code:
find /root -name "statechange*" -exec rm -f '{}' \;

Um dir alles anzeigen lassen zu können lass die metadaten beim ls weg:
Code:
ls -1 /root
 
Stype schrieb:
Das Suchergebnis muss literal gelöscht werden.
Code:
find /root -name "statechange*" -exec rm -f '{}' \;
Das hat leider nur die normalen Dateien, nicht aber die 38.000 Sonderlinge gelöscht.
Ergänzung ()

Zumindestens steht jetzt kien Fragezeichen mehr da.

773288
 
Zurück
Oben