Forum: PC Hard- und Software Linux: Datei mit führenden Strichen löschen


von Ernst (Gast)


Lesenswert?

Ich habe in meinem Homeverzeichnis eines Datei mit dem Namen --set 
liegen. Ist irgendwann mal versehentlich entstanden, als ein 
Kommandozeilenparameter als Dateiname für die Ausgabe genutzt wurde.

Nun kann ich diese Datei aber nicht mehr anzeigen oder löschen. In 
meiner shell (ZSH) habe ich schon folgendes probiert:
1
$ cat --set
2
cat: unrecognized option '--set'
3
Try 'cat --help' for more information.
4
$ cat "--set"
5
cat: unrecognized option '--set'
6
Try 'cat --help' for more information.
7
$ cat "\-\-set"
8
cat: '\-\-set': No such file or directory
9
$ cat \-\-set  
10
cat: unrecognized option '--set'
11
Try 'cat --help' for more information.
12
cat '--set'
13
cat: unrecognized option '--set'
14
Try 'cat --help' for more information.
15
$ cat '\-\-set'
16
cat: '\-\-set': No such file or directory
17
$ cat '\--set' 
18
cat: '\--set': No such file or directory

Jemand eine Idee?

von Programmierer (Gast)


Lesenswert?

1
rm -- --set

von Andreas B. (bitverdreher)


Lesenswert?

mit midnight commander geht das. Wie der das allerdings macht, weiss ich 
auch nicht.

von LOL (Gast)


Lesenswert?

Funktioniert
1
cat [-][-]set
nicht?

von admin (Gast)


Lesenswert?

wenn im Homeverzeichnis dann
1
rm /home/user/--set.

von DerEgon (Gast)


Lesenswert?

1
rm ./--set

probiert?

von Norbert (Gast)


Lesenswert?

1
$ > -a
2
$ > --b
3
$ rm './-a'
4
$ rm './--b'

von LOL (Gast)


Lesenswert?

Edit:

LOL schrieb:
>
1
> cat [-][-]set
2
>

Funktioniert nicht, der Trick klappt nur bei grep.
1
ps ax | grep [s]h
Das Ergebnis ist, dass grep sich nicht mehr selbst in der Befehlsliste 
findet :-)


Aber
1
touch -- --test
2
cat -- --test
3
rm -- --test

funktioniert, wie oben schon richtig geschrieben.

von Ernst (Gast)


Lesenswert?

Programmierer schrieb:
> rm -- --set

Danke, das wars

von Christoph Z. (christophz)


Lesenswert?

Bei wirklich zickigen Dateinamen mit noch mehr Müll/Sonderzeichen etc. 
drin geht immer auch der Trick, sie per Inode zu adressieren:
https://superuser.com/questions/143125/remove-a-file-on-linux-using-the-inode-number

von Programmierer (Gast)


Lesenswert?

Über die grafischen Dateiexplorer (Nautilus & Co) sollte es allerdings 
auch kein Problem sein, einfach ganz normal löschen. Ist halt eher auf 
Servern ohne GUI ein Problem.

Andreas B. schrieb:
> mit midnight commander geht das. Wie der das allerdings macht,
> weiss ich
> auch nicht.

Der ruft einfach unlink() auf. Da ist dann kein Escaping, 
Kommando-Interpretation o.ä. zwischen. Genau wie bei Nautilus & Co.

Christoph Z. schrieb:
> Bei wirklich zickigen Dateinamen mit noch mehr Müll/Sonderzeichen
> etc.

Besonders witzig: Dateinamen mit vermurkster Codierung!

von Schlaumaier (Gast)


Lesenswert?

Frage von einen Linux-Neuling.

Gehen da keine "" wie bei Windows. ??

Also :

BEFEHL "egal -was -das -ist"

von Mombert H. (mh_mh)


Lesenswert?

Ernst schrieb:
> Jemand eine Idee?

"man rm" enthält bei mir (GNU coreutils 9.0):
1
To remove a file whose name starts with a '-', for example '-foo', use one of these commands:
2
              rm -- -foo
3
              rm ./-foo

von Idioten umgeben (Gast)


Lesenswert?

Ermittele den inode anzeigen und übergib rm diesen als parameter, ggf 
mit dazwischen gepipten 'find'.

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

von Mombert H. (mh_mh)


Lesenswert?

Idioten umgeben schrieb:
> Ermittele den inode anzeigen und übergib rm diesen als parameter,
> ggf
> mit dazwischen gepipten 'find'.
>
> https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html
Hast du mal versucht das anzuwenden? Die dort beschriebenen Methoden den 
inode zu bestimmen haben das gleiche Problem wie rm.
1
stat --set
2
# stat: unrecognized option '--set'
3
ls -il --set
4
# ls: unrecognized option '--set'
Zumindes für die in GNU coreutils 9.0 enthaltenen ls und stat.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Schlaumaier schrieb:
> Frage von einen Linux-Neuling.
>
> Gehen da keine "" wie bei Windows. ??
>
> Also :
>
> BEFEHL "egal -was -das -ist"

Dann wird nach einen Programm gesucht, das "egal -was -das -ist" heißt 
(ohne die Anführungszeichen, aber mit den Leerzeichen und allem anderen 
im Namen der Programmdatei). Kommandozeilenparameter werden ihm keine 
übergeben.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Schlaumaier schrieb:
> Gehen da keine "" wie bei Windows. ??

Doch, aber es bringt nichts. Hier haben wohl einige ein 
Verständnisproblem:

Es gibt hier zwei Fallen:

1. Den Dateinamen als Argument korrekt an das Programm "rm" zu geben. 
Das wird tückisch wenn der Dateiname Leerzeichen, Anführungsstriche und 
andere Sonderzeichen enthält, weil er dann von der Shell (Unix) bzw. von 
der C-Laufzeitumgebung selbst (Win32) ggf. falsch interpretiert wird.

z.B.
1
rm a b
Übergibt zwei Argumente "a" und "b" an das "rm"-Programm, statt einem 
Argument "a b". Gegen diese Falle helfen Anführungsstriche und/oder 
Escaping, also z.B.
1
rm "a b"
.

2. Das Programm "rm" muss den Dateinamen auch korrekt als solchen 
verstehen und nicht versuchen, ihn als Option zu interpretieren. Fängt 
der Dateiname mit "-" an, versucht "rm" ihn als Option zu verstehen. 
Dagegen hilft es, vor den Dateinamen ein zusätzliches Argument "--" zu 
packen, wie schon gezeigt. Dies weist "rm" an, das folgende Argument 1:1 
als Dateiname zu verwenden, ohne zu versuchen, es als Option zu 
interpretieren, also
1
rm -- --set

Offenbar haben wir hier nur Problem 2. Die Anführungsstriche nützen 
nichts, denn das "--set" kommt schon korrekt bei "rm" an, aber "rm" 
interpretiert es als Option. An dieser Stelle sind eventuelle 
Anführungsstriche schon längst wieder entfernt worden.

Anführungsstriche würden nur etwas bringen, wenn der Dateiname 
zusätzlich noch ein Leerzeichen enthielte, z.B.:
1
rm -- "--s et"
Die Anführungsstriche werden von der Shell interpretiert und entfernt, 
und die beiden Strings "--" und "--s et" werden (*ohne 
Anführungsstriche*) an den Kernel und den Subprozess (rm) übergeben.

von Bernd L. (berndiboy)


Lesenswert?

1
fancy@shell:~/ cat > "--set"
2
Männliches Geschlechtsorgan
3
Ctrl+D
4
fancy@shell:~/ /bin/bash
5
proper@shell:~/ rm ./--set
6
proper@shell:~/ ls
7
proper@shell:~/

Du kannst auch /bin/dash nehmen, die ist auf jeden Fall installiert. Der 
Rest ist zu kompliziert, oder fürs Skripten nutzlos, weil man dafür halt 
die Standard-Shells nimmt.

von Schlaumaier (Gast)


Lesenswert?

Programmierer schrieb:
> Doch, aber es bringt nichts. Hier haben wohl einige ein
> Verständnisproblem:

Ich JETZT nicht mehr.

Danke für die Erklärung.

von Rolf M. (rmagnus)


Lesenswert?

Bernd L. schrieb:
> Du kannst auch /bin/dash nehmen, die ist auf jeden Fall installiert.

Die Shell ist recht egal, weil rm eh ein eigenes Tool ist. Und die oben 
gezeigte Option mit -- ist POSIX-Standard für alle Tools.
Siehe 12.2 Guideline 10 unter 
https://pubs.opengroup.org/onlinepubs/9699919799/

: Bearbeitet durch User
von Nano (Gast)


Lesenswert?

Christoph Z. schrieb:
> Bei wirklich zickigen Dateinamen mit noch mehr Müll/Sonderzeichen etc.
> drin geht immer auch der Trick, sie per Inode zu adressieren:
> 
https://superuser.com/questions/143125/remove-a-file-on-linux-using-the-inode-number

Es können allerdings mehrere Dateinamen auf eine Inode zeigen. Da muss 
man also aufpassen.

Zur Frage des TS.

Ich habe damals einfach den Dateimanager verwendet. Allerdings war das 
lokal am Rechner mit laufendem X Server.

von Christoph Z. (christophz)


Lesenswert?

Programmierer schrieb:
> Christoph Z. schrieb:
>> Bei wirklich zickigen Dateinamen mit noch mehr Müll/Sonderzeichen
>> etc.
>
> Besonders witzig: Dateinamen mit vermurkster Codierung!

Genau darum kenne ich diesen Trick mit der Inode :-)

Die Übergangszeit von Latin1/CP12xx zu überall und immer 
funktionierendem UTF8 hat ihre Leichen hinterlassen...

von AtariST (Gast)


Lesenswert?

Christoph Z. schrieb:
> Besonders witzig: Dateinamen mit vermurkster Codierung!

Genau dieses Problem hatte ich vor Kurzem, als ich unter Windows 10 eine 
Festplatte aufgeräumt hatte, die viele Backupdaten enthielt. Da waren 
auch einige HOME-Verzeichnisse aus Linux-Installationen dabei. Einige 
Ordner konnte ich partout nicht löschen, weil eben genau dieses Problem 
auftrat. Unter Linux war dies kein Thema. Die Platte selbst hatte NTFS 
als Dateisystem. Besonders lustig war es, wenn zwei Ordner oder Dateien 
mit gleichem Namen nebeneinander existierten, sich aber in Groß und 
Kleinschreibung unterscheiden. Unter Linux kann man sie so auch unter 
NTFS anlegen. Beim Versuch sie zu verschieben, wurde nur einer dieser 
Ordner kopiert, der andere wurde ohne Nachfrage gelöscht und war dann 
auch nicht mehr aus dem Papierkorb wieder herstellbar. Ob das ein 
generelles Problem ist, weiß ich allerdings nicht.

von Alexander (alecxs)


Lesenswert?

1
find -maxdepth 1 -type f -name '--set' -delete

Wildcard/globbing (Sternchen) *set geht auch, sofern keine weiteren 
Dateien mit set enden.

Bei ganz kryptischen Dateinamen kann man find mit -mtime und -size etc. 
weiter eingrenzen solange bis nur noch genau die unerwünschte Datei 
gefunden wird, dann das -delete hinzufügen.

: Bearbeitet durch User
von Rüdiger B. (rbruns)


Lesenswert?

AtariST schrieb:
> Beim Versuch sie zu verschieben, wurde nur einer dieser
> Ordner kopiert, der andere wurde ohne Nachfrage gelöscht und war dann
> auch nicht mehr aus dem Papierkorb wieder herstellbar.

Weil Windows die zwei Dateien zu einer Datei Kopiert.

von oszi40 (Gast)


Lesenswert?

Rüdiger B. schrieb:
> Weil Windows die zwei Dateien zu einer Datei Kopiert.
robocopy -?
Evtl. robocopy Option /mir (Mirror) mal versuchen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.