Ich versuche, ein PNG-Bild zu entfernen, das über ein PHP-Skript auf meinen Server hochgeladen wurde. Immer wenn ich versuche, es sowohl über FTP als auch über das Terminal zu löschen, erhalte ich die Fehlermeldung
No such file or directory
Wenn ich mich jedoch ls
im Verzeichnis befinde, wird die Datei aufgelistet und sie wird auch in meinem FTP-Client aufgelistet. Ich habe versucht, eine Datei mit demselben Namen zu erstellen, und am Ende erhalte ich zwei Dateien mit demselben Namen.
Ich kann die Datei öffnen, die angeblich nicht existiert, aber ich kann sie immer noch nicht entfernen. Ich habe auch versucht, meinen Server neu zu starten. Irgendwelche Ideen, was könnte das Problem sein? Ich verwende eine 64-Bit-Version von Ubuntu, glaube aber nicht, dass es sich um ein 32/64-Bit-Problem handelt. Ich sollte auch beachten, dass ich viele andere PNG-Dateien entfernt habe, die mit demselben PHP-Skript hochgeladen wurden.
Ausgabe für ls -l
total 224
-rw-r--r-- 1 www-data www-data 222838 May 13 04:14 qyxdshyikfr_fishing_timeout.png
-rw-r--r-- 1 root root 272 May 14 06:54 upload.php
Ausgabe beim Versuch rm
rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory
upload.php: http://pastebin.com/z87eypTY
ls -l
aus dem Verzeichnis, auch der vollständigerm
Befehl und seine Ausgabe ..rm
Befehl aus?unlink
Aufruf schlägt immer fehl, eine Datei zu finden, die nicht vorhanden ist. Wenn ich diesenstrace
Befehl auf meinem System ausführe und weiß, dass ich keine solche Datei habe, wird eine ähnliche Ausgabe erzeugt. Ich glaube nicht, dass ich ein Dateisystemproblem habe! Es ist weitaus wahrscheinlicher, dass sich der Name der Datei geringfügig von dem Namen der Datei unterscheidetqyxdshyikfr_fishing_timeout.png
und aufgrund von Einschränkungen bei derls
Anzeige von Dateinamen nur derselbe ist , wie in anderen Antworten vorgeschlagen.Antworten:
Das heißt, ohne Beschädigung des Dateisystems, dass Sie zwei Dateien haben mit zwei unterschiedlichen Namen haben , die aufgrund nicht druckbarer Zeichen oder Zeichen, die in Ihrem Zeichensatz / Ihrer Schriftart gleich aussehen, gleich aussehen. Die
--escape
Option zuls
ist in solchen Fällen Ihr Freund, ebenso wie Tools wiecat -v
.So ist es auch
rm -i -- *
Weitere Lektüre
quelle
rm -i -- *
.rm -i -- *
Befehl erklären ?-i
werden Sie vor dem Entfernen der einzelnen Dateien aufgefordert, diese zu übergeben.--
before*
wählt alle Dateien aus, unabhängig davon, ob ihre Namen Sonderzeichen enthalten. Referenz: https://explainshell.com/explain?cmd=rm+-i+--+*TL; DR: Führen
ls -1b
Sie den Befehl aus, suchen Sie den Dateinamen, kopieren Sie die Zeile, in der er angezeigt wird, und geben Sie diesen anrm
.Wie andere vorgeschlagen haben, liegt dies höchstwahrscheinlich an Einschränkungen in der Art
ls
und Weise, und einige andere Programme, einschließlich Client- und Serversoftware, behandeln standardmäßig seltsame Dateinamen, wie z. B. solche, die Steuerzeichen enthalten. Ihr Erfolg mit der Antwort von JdeBP deutet stark darauf hin, dass dies der Fall war, obwohl es schon vorher eine gute Wette gewesen wäre.Für
ls
, wenn die Standardausgabe ein Terminal ist,?
Zeichen werden an ihrer Stelle aufgedruckt. Wenn Sie alsols
die Ausgabe nicht an einen anderen Befehl weiterleiten (oder zur Anzeige in ein Protokoll umleiten), enthält Ihr Dateiname wahrscheinlich keine Steuerzeichen. Es gibt aber auch andere problematische Zeichen - vielleicht enthält der Dateiname beispielsweise ein nachgestelltes Leerzeichen.Dieses Verhalten von
ls
kann verwirrend sein, stellt jedoch keinen Fehler dar und kann vom Benutzer explizit überschrieben werden (siehe unten).Fehler in der Client- oder Serversoftware können zu solchen Problemen führen, wenn versucht wird, remote auf eine Datei zuzugreifen oder diese zu entfernen .
Ich habe so etwas
ftp
mehrmals selbst erlebt , auch bei Dateien, deren Namen nachgestellte Leerzeichen enthalten. (Dass es nicht funktioniert hat, liegt an einem Fehler in meinem FTP-Client.) Auch wenn Sie eine Datei manuell erstellen, ist es manchmal recht einfach, versehentlich ein Leerzeichen oder ein anderes Leerzeichen einzufügen kann wie Leerzeichen aussehen, obwohl es nicht ist.Dies ist eine Situation, in der
ls -1b
(oderdir -1
) nützlich ist:-1
Zeigtls
einen Eintrag pro Zeile an. Auf diese Weise gibt es keine Verwirrung darüber, wo ein Dateiname endet und ein anderer beginnt. Dies ist praktisch für seltsam benannte Dateien.-b
Weistls
an, Escape-Sequenzen für Sonderzeichen zu drucken. Die Ausgabe vonls -b
kann ohne zusätzliche Anführungszeichen wörtlich in einen Befehl kopiert und eingefügt werden : Alle problematischen Zeichen werden bereits so in Anführungszeichen gesetzt, dass die Shell sie als das erkennt, was sie sind.Es gibt nur eine Einschränkung: Wenn das letzte Zeichen in einer Zeile zu sein scheint
\
, kopieren Sie danach ein Zeichen, da dies bedeutet\
ein Leerzeichen in Anführungszeichen gesetzt wird.Sie können
ls -1b
einfach so laufen oder ein Shell-Glob-Muster übergeben (zBls -1b qyx*
). Beim Verschieben wird die Datei möglicherweise gefunden oder nicht, je nachdem, ob die Steuerzeichen (oder andere seltsame Zeichen) in dem Teil des Namens vorhanden sind, der im Verschiebungsmuster angezeigt wird.Nachdem Sie die von
\
angegebene Version des Dateinamens kopiert habenls
, können Sie diese in einen Befehl einfügen. Sie müssen es in keiner Weise manuell ändern. Wenn Sie die Datei löschen möchten, geben Sierm
ein Leerzeichen ein, fügen Sie die Zeile ein und drücken Sie Enter.Weitere Lektüre:
ls
: Verzeichnisinhalte im GNU coreutils Referenzhandbuch auflisten .ls
(unddir
) seltsame Dateinamen angezeigt werden.quelle
-b
thx =) und +1rm -i -- *
.ls
Ausgabe in der Frage, kann aber nur im Textmodus angezeigt werden, wenn Sie auf "Bearbeiten" klicken.Verwenden
find
und überprüfen Sie die Ausgabe:Wird die Datei nicht gefunden, verkürzen Sie den Suchbegriff
*qyxdshyikfr*
leicht, zB:*qyxds*
oder*fishing*
.Wenn ok, dann
find
mit dem Suchbegriff in Schritt 1 und verwendenrm
quelle
rm
von namentlich über ein Rohrfind
zuxargs
, empfehle ich einfach mitfind
‚s-delete
Aktion. Wird auchsudo
nicht benötigt. Weniger bedeutend, ich schlage vor, wegzulassen, es sei-type f
denn, dies ist eindeutig hilfreich. Wenn sich beispielsweise herausstellt, dass der zu löschende Eintrag eine symbolische Verknüpfung ist, möchten sie ihn weiterhin suchen und löschen. Die-delete
Aktion löscht ein Verzeichnis nicht rekursiv. und deinrm
Befehl auch nicht, da du keinen hast-r
. Sie werden hier also nicht versehentlich einen ganzen (nicht leeren) Ordner zerstören, indem Sie ihn nicht verwenden-type
.find ... -delete
sagt sogar "kann nicht löschen ... Keine solche Datei oder Verzeichnis"Umschreiben im Detail, erweitert von meinem Kommentar zu Elias Antwort
Das Problem ist unsichtbar, kann jedoch angezeigt werden, wenn Sie wissen, wonach Sie suchen müssen: Der Dateiname enthält am Ende ein Leerzeichen. Da Sie die gesamte
ls
Ausgabe kopiert / eingefügt haben , wird in der Frage angezeigt, ob Sie die Ausgabe markieren oder den Beitrag bearbeiten und den Cursor an das Ende bewegen oder (wie Eliah betont hat) den Unterschied im Bearbeitungsverlauf betrachten. Ich habe diels
Ausgabe im Beitrag in diesem Screenshot hervorgehoben:Eine kurze kleine Terminalsitzung, um das Problem zu duplizieren, mit Kommentaren:
Die Verwendung der Tabulatorvervollständigung hätte das Problem hier auch vollständig umgangen, da bash klug genug ist, um Leerzeichen korrekt zu umgehen (es ist auch eine gute Angewohnheit, die Eingabe von Pfaden so stark zu beschleunigen) .
Wenn ich zum Beispiel getippt hätte
rm f<tab>
, hätte es sich automatisch vervollständigtrm foo\<space><space>
, wie im letzten Beispiel im obigen Codeblock.quelle
ls
Ausgabe, da auf StackOverflow einmal etwas Ähnliches passiert ist (und das ist der ganze Grund, warum ich darüber nachgedacht habe): Jemand hat ein nicht druckbares Zeichen in seinem Code und der einzige Grund, warum es jemand herausgefunden hat Das liegt daran, dass dieser Benutzer beim Posten der Frage auch den Code kopiert / eingefügt hat, anstatt ihn erneutIch habe einmal eine Datei erstellt, um Nautilus als root zu öffnen, aber der Dateiname bei der Anzeige von Nautilus war "Dateibrowser (root)", und dann, als ich versuchte, als zu entfernen
Die einzige Antwort, die ich bekam, war: "rm: kann 'File Browser (Root) .desktop' nicht entfernen: Keine solche Datei oder Verzeichnis"
wenn ich dann renne:
Ich sah / erinnerte mich, dass der Dateiname tatsächlich "Nautilus-root.desktop" war
Also renne ich:
arbeitete für mich, hoffe es hilft!
quelle
Also hatte ich dieses Problem und keines dieser Dinge funktionierte für mich. Was funktionierte, war das Erstellen einer Datei mit genau demselben Namen. Es war ein Ordner mit dem Namen Example.1.2.3, also habe ich einen neuen Ordner erstellt und ihn genauso benannt wie den, den ich nicht löschen wollte. Der alte Ordner verschwand und ich löschte den neuen.
quelle
Ich hatte eine ähnliche Situation nach der Verwendung
rsync
ich mein Bilder- Verzeichnis auf einem Mac gesichert und unter Ubuntu gelesen hatte. Es gab zwei Dateien (tatsächlich Verzeichnisse) mit unterschiedlichen Namen, aber mit demselben Inhalt. Ich habe eines in den Papierkorb (mit Nautilus) gelöscht, das andere konnte ich jedoch nicht löschen, auch nicht über die Befehlszeile. Es würde sagen:Nach Überprüfung der Inode-Nummern mit ls -i -l stellte sich heraus, dass beide Verzeichnisse die gleiche Inode-Nummer haben. Sieht aus wie eine harte Verbindung ...
Die Lösung war überraschend einfach: Leeren Sie den Papierkorb, indem Sie mit der rechten Maustaste auf das Symbol klicken. Danach waren beide Verzeichnisse weg.
quelle