Ich habe es irgendwie geschafft, eine Datei zu erstellen, die keinen Dateinamen zu haben scheint. Im folgenden Thread habe ich einige Informationen dazu gefunden, wie Sie weitere Details der Datei abrufen können.
Ich habe jedoch einige der aufgeführten Vorschläge ausprobiert und kann die Datei anscheinend nicht löschen. Ich bin nicht sicher, was ich getan habe, um es zu erstellen, aber es ist passiert, als ich versucht habe, eine XML-Datei zu kopieren.
Einige Informationen in der Datei lauten wie folgt:
> ls -lb
total 296
-rw-r--r-- 1 voyager endeavor 137627 Jan 12 12:49 \177
> file *
: XML document
> ls -i
417777
Ich habe versucht, mithilfe des Inum-Schalters herauszufinden, ob dies der narrensicherste Weg ist, es loszuwerden. Das Beispiel am Ende des unten verlinkten Threads ist für mich jedoch fehlgeschlagen. Beispiel war:
> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
Also habe ich zuerst versucht, die Pfadliste wie folgt zu verwenden, aber das hat auch nicht funktioniert:
> find . -inum 41777 -exec ls -al {} \;
Ich bin nicht sicher, was das nicht druckbare Zeichen \ 177 ist oder wie ich das an einen rm
Befehl übergeben kann, aber ich möchte wirklich sicherstellen, dass ich keine anderen Dateien / Verzeichnisse vermassle, wenn ich versuche, diese Datei zu löschen.
quelle
\177
ist das ASCII-DEL
Zeichen.0
?Antworten:
Die Datei hat einen Namen, besteht jedoch aus nicht druckbaren Zeichen. Wenn Sie ksh93, bash, zsh, mksh oder FreeBSD sh verwenden, können Sie versuchen, es zu entfernen, indem Sie den nicht druckbaren Namen angeben. Stellen Sie zunächst sicher, dass der Name richtig ist mit:
ls -ld $'\177'
Wenn die richtige Datei angezeigt wird, verwenden Sie rm:rm $'\177'
Ein anderer (etwas riskanterer) Ansatz ist die Verwendung
rm -i -- *
. Mit der Option -i muss rm vor dem Entfernen einer Datei bestätigt werden, damit Sie alle Dateien überspringen können, die Sie behalten möchten, außer der einen.Viel Glück!
quelle
rm -i *
das hätte in diesem Fall nicht funktioniert. Aufgrund der Zeilenumbrüche würde die Shell*
zu etwas erweitert,rm
das nicht als Dateiname erkannt wird.bash
und GNU unterschätztrm
. Auf meinem Systemrm *
,rm -i *
undrm Ctrl-V DEL TAB ENTER
alle Arbeiten korrekt, auch wenn der Dateiname enthält ein Newline - Zeichen (I verwendet"\177foo\nbar\n"
). Einige Befehle behandeln solche Dateinamen nicht gut, aber die GNU-Tools scheinen robust zu sein. Nicht-GNU-Versionen der gleichen Tools verhalten sich möglicherweise nicht so gut. In jedem Fall ist es hilfreich, die verschiedenen Tricks in diesen Antworten zu kennen.rm
teilt niemals Wörter, egal ob GNUrm
oder nicht. Die Shell erweitert die Globs und übergibt bei Ausführung des aufgerufenen Befehls die resultierenden Dateinamen als durch Null getrennte Argumente (im C-Code). Was gefährlich ist Rohr eine Liste von Dateien zu etwas , das verwendet Zeilenumbrüche als Trennzeichen; Siehe Warum ist das Schleifen über Finds Ausgabe eine schlechte Übung?Für diejenigen,
vim
die es im aktuellen Arbeitsverzeichnis ausführen:und navigieren Sie mit den Pfeiltasten oder zur Datei
j/k
. Drücken Sie dannShift+D
und bestätigen Sie den Löschvorgang mity
.quelle
Es gibt wahrscheinlich eine Möglichkeit, den Dateinamen an zu übergeben
rm
, aber wenn Sie Bedenken haben, etwas durcheinander zu bringen, können Sie einen GUI-Dateimanager verwenden. Emacs wird mit einem Verzeichnisbearbeitungsmodus geliefert, den Sie verwenden können, wenn Sie ihn installiert haben:Öffnen Sie den Ordner in
emacs
. Sie könnenemacs /path/to/folder
Emacs ausführen oder öffnen, Esc+ drücken xund ausführendired
, wodurch Sie zur Eingabe des Pfads aufgefordert werdenhttp://so.mrozekma.com/unix-dired-delete1.png
Gehen Sie zu der Zeile mit der Datei, die Sie löschen möchten, und drücken Sie d. Sie sollten
D
am linken Rand neben der Datei ein sehen:http://so.mrozekma.com/unix-dired-delete2.png
Drücken Sie x, um Ihre Änderungen zu speichern. Sie werden aufgefordert, sicherzustellen, dass Sie die Datei löschen möchten. Presse y:
http://so.mrozekma.com/unix-dired-delete3.png
quelle
vim
führen Sie es im aktuellen Arbeitsverzeichnis aus:vim ./
und navigieren Sie mit den Pfeiltasten zu der Datei. Drücken Sie dannShift+D
und bestätigen Sie den Löschvorgang mity
.vim
es unterstützeSie haben bereits gezeigt,
file *
dass die Shell glob (*
) in der Lage ist, diese Datei aufzunehmen, also machen Sie jetzt einfach einerm
auf diesem Glob.rm -i *
n
für alle Dateien außer der mit dem scheinbar unsichtbaren Dateinamen einquelle
Die Datei hat tatsächlich einen Namen, besteht jedoch aus nicht druckbaren Zeichen.
Eine einfache Methode besteht darin, sich auf die Vervollständigung der Shell zu verlassen: Drücken Sie Tabwiederholt, bis der „seltsame“ Dateiname eingefügt wird. Sie müssen Ihre Shell so konfiguriert haben, dass Sie zwischen möglichen Abschlüssen wechseln können:
menu-complete
, was nicht standardmäßig gebunden ist, sondern ehercomplete
, was Tabstandardmäßig gebunden ist . Alternativ können Sie Esc *Vervollständigungen für alle Dateien einfügen und diejenigen, die Sie nicht löschen möchten, aus der Befehlszeile entfernen.setopt auto_menu
odersetopt menu_complete
einstellen.Wenn die Vervollständigung in Ihrer Shell nicht hilfreich ist, können Sie mit
rm -i -- *
Ausnahme dieser bestimmten Datei "Nein" anrufen und antworten. Wenn der Dateiname nicht mit einem druckbaren Zeichen beginnt, können Sie die Übereinstimmungen auf Dateien beschränken, deren erstes Zeichen nicht in einem Satz druckbarer Zeichen enthalten ist:(Passen Sie auf, ob Ihr Muster möglicherweise mit einer aufgerufenen Datei übereinstimmt
-f
, wasrm
als Option behandelt würde.)Eine andere Methode ist der Aufruf
ls -i
, um den Inode der Datei zu finden (ein Inode identifiziert eine Datei auf einem bestimmten Dateisystem eindeutig) und dannfind -inum
auf diese bestimmte Datei zuzugreifen. Diese Methode ist vor allem dann nützlich, wenn das Verzeichnis viele Dateien enthält.Wenn Sie
find
keine-delete
Option haben, rufen Sie anrm
:(Ja, ich weiß, dass das meiste bereits veröffentlicht wurde. Die Antworten mit den relevanten Informationen machen dies jedoch komplizierter, als es sein sollte.)
quelle
Versuchen Sie es mit
echo -e
, um den Charakter zu erhalten\177
, undxargs
übergeben Sie ihn dann anrm
.Stellt fest, dassecho
Es werden keine Dezimal-Escape-Zeichen verwendet. In Hex konvertieren:177
es sich um ein Oktal handelt.echo
erfordert ein\0
(Literal, kein Null-Byte) vor:quelle
\xb1
ist dezimal177
,\0
beendet es mit Null und-0
weistxargs
an, einen Namen mit Null anstelle eines Namens mit Zeilenumbruch zu verwenden.echo
sendet 2 Dateinamen an xargs und dann weiter anrm
... Der zweite Dateiname lautet\n
.. Dies führt entweder zu einem Fehler oder zum Löschen einer Datei mit diesem Namen ('\ n')-n
, um die Newline loszuwerden.Ich kann Ihnen nur garantieren , dass die Datei hat einen Namen hat. Es ist einfach ein Name, der nicht druckbare Zeichen enthält.
Wenn
rm
dies nicht funktioniert hat, hilft es wahrscheinlich nicht, die Ausgabe vonfind
mit der-inum
Option als Argument fürrm
zu verwenden. Es wird nur das gleiche Argumentrm
mit dem gleichen Problem übergeben.Die Datei ist die einzige in diesem Verzeichnis, oder?
Das erste, was ich versuchen würde, ist,
cd
in das Verzeichnis zu gehen, es einzugebenrm ./
und dann die Tabulatortaste zu drücken. Dadurch sollte das Argument auf den tatsächlichen Namen der Datei erweitert werden, und das Vorhergehende./
sollte verhindernrm
, dass das Argument als etwas anderes als ein Dateiname interpretiert wird.Eine andere Lösung besteht darin,
cd
in das übergeordnete Verzeichnis zu wechseln und dann das Verzeichnisrm -r
(oder, falls erforderlich,rm -rf
) zu verwenden. Das sollte das Verzeichnis und seinen gesamten Inhalt unabhängig vom Namen entfernen. Sie können dann verwendenmkdir
, um das Verzeichnis neu zu erstellen (und möglicherweisechmod
seine Berechtigungen wiederherzustellen).EDIT:
Bei
ls -lb
nochmaliger Betrachtung Ihrer Ausgabe denke ich, dass der Dateiname mit einem ASCII-DEL
Zeichen beginnt (was nicht schlimm ist, nicht schwerwiegend) und ein oder mehrere Zeilenumbrüche enthält (was wirklich schlimm ist). Soweit ichrm
weiß , kann der Befehl einen Zeilenumbruch nicht als Teil eines Dateinamens interpretieren.Aber der
unlink()
Systemaufruf kann. Hier ist ein von mir zusammengestelltes Perl-Skript, das die Dateien im aktuellen Verzeichnis durchläuft und Sie nach jedem fragt, ob Sie es entfernen möchten. Es wird kein externer Befehlrm
zum Entfernen der Dateien verwendet. Daher sollte es in der Lage sein, alle vom Dateisystem unterstützten komischen Zeichen (außer ASCIINUL
und/
) zu verarbeiten.Tun
rm -r
oderrm -rf
auf dem enthaltenden Verzeichnis sollte immer noch funktionieren, aber wenn Sie nur eine einzelne Datei entfernen möchten, können Sie dies versuchen.(Eine andere Lösung, wenn das Verzeichnis andere Dateien enthält, die Sie behalten möchten, besteht darin, alle anderen Dateien in ein temporäres Verzeichnis zu verschieben, das Verzeichnis zu speichern und neu zu erstellen und die anderen Dateien zurück zu verschieben.)
(Oh, und was auch immer Sie getan haben, um diese Datei zu erstellen, versuchen Sie es nicht noch einmal!)
quelle
Wenn Sie mit dem Befehl genau diese Datei finden können,
find
können Sie das-delete
Prädikat verwenden. Seien Sie vorsichtig und geben Sie-delete
einen letzten Parameter für den Befehl find ein, da dies sonst sehr weh tut.quelle
Du bist nah dran. Schritt für Schritt, hier erfahren Sie, wie Sie die Datei nach Inode-Nummer löschen.
Ermitteln Sie zunächst mit die Inode-Nummer der gewünschten Datei
ls -li
. Die Inode-Nummer befindet sich in der ersten Spalte der Ausgabe.Zum Beispiel:
In diesem Fall lautet die Inode-Nummer 311010
Verwenden Sie
find
diese Option, um die Datei anhand der Inode-Nummer zu suchen.Stellen Sie sicher, dass
find
nur der Name der zu löschenden Datei zurückgegeben wird. Zum Beispiel:Wenn Sie sicher sind, dass
find
die richtige Datei gefunden wurde, übergeben Sie den-delete
Parameter anfind
. Es wird die Datei für Sie löschen.quelle
Die anderen Antworten sind großartig und funktionieren in fast allen Umgebungen.
Wenn jedoch eine GUI ausgeführt wird, öffnen Sie einfach das Verzeichnis in Nautilus, Delphin, Konqueror oder Ihrem bevorzugten Dateimanager, und Sie sollten in der Lage sein, jede Datei, die einen unkooperativen Namen hat, mit ein paar Mausklicks zu sehen und zu löschen .
Wenn Sie kein normaler Emacs- oder Vim-Benutzer sind (wie in mehreren anderen Antworten beschrieben), ist dies möglicherweise der einfachste Weg.
quelle
Hatte ein ähnliches Problem mit einer Datei namens "\ 033" (dem eigentlichen "Escape" -Zeichen).
Mit dem obigen Befehl werden Sie aufgefordert, Dateien im aktuellen Verzeichnis zu entfernen, die nicht mit einem Buchstaben oder einer Zahl beginnen.
quelle
Stattdessen können Sie das aktuelle Verzeichnis in umbenennen
DirX_OLD
, ein neues Verzeichnis mit dem Namen erstellenDirX
und alle erforderlichen Dateien vonDirX_OLD
nach verschiebenDirX
. Nach dem Kopieren der Dateien können Sie diese löschenDirX_OLD
quelle
Nur für den Fall, dass es jemandem hilft, füge ich meine zwei Cent hinzu. Ich konnte die Dateinamen mit
stat
dem folgenden Platzhalter abrufen:Ausgabe:
Dann könnte ich ANSI-C-Anführungszeichen verwenden (wie in der akzeptierten Antwort verwendet), um auf die Dateien zuzugreifen:
quelle
Jede Datei hat einen Namen, man muss nur genau den finden.
Ich werde diese Dateien als Beispiele verwenden:
Diese Dateien werden wie
?
gewohnt angezeigtls
:Wenn Sie
ls
die-Q
Option zulassen , sollte jedoch klar sein, wie der tatsächliche Dateiname lautet:Dies sind die Inode-Nummern und "Anführungszeichen" in der
1
Spalte der Dateien in pwd.Das nutzt die Fähigkeit einer (POSIX) Shell, Erweiterungen (Globbing) zu verwenden:
Um die Namen mit einem nicht druckbaren Zeichen zu haben:
Und um Dateien aufzulisten, die möglicherweise nur nicht druckbare Zeichen enthalten:
-i
Um sie dann selektiv (über die (interaktive) Option) zu entfernen, verwenden Sie:Sie müssen nur auswählen, welche gelöscht werden sollen, indem Sie
y
die oben stehende Frage beantworten .quelle
Wenn Sie eine Bash mit Autovervollständigung haben, funktioniert dies möglicherweise für Sie. Ich habe das Zeichen eingegeben, das in der Verzeichnisliste angezeigt wurde. Dann habe ich die Autovervollständigung ausgelöst und das Ding in etwas Druckbares umbenannt.
Folgendes hat bei mir funktioniert:
quelle
arbeitete für mich.
quelle