Versehentlich erstelltes Verzeichnis mit dem Namen "~" (Tilde)

47

Ich habe es geschafft, ein Verzeichnis mit einem wörtlichen Namen zu erstellen~ .

(Anscheinend macht Python das os.mkdir('~/something').)

Wie entferne ich es, ohne mein Zuhause zu beschädigen?

Auch wenn es hilft, habe ich mein real /homeauf einer separaten Partition. Und das Duplikat ~befindet sich in (der realen ) ~.

UniversallyUniqueID
quelle
51
Obligatorische XKCD . Ok, ich habe vielleicht gelogen, dass es obligatorisch ist. Und eine XKCD zu sein.
Jesvin Jose
30
Um die Python-Frage zu beantworten, die Sie in Zukunft nicht gestellt haben, verwenden Sie os.mkdir(os.path.expanduser('~/something')).
Matt Nordhoff
8
... nur aus Neugier, da Sie das Verzeichnis in Python erstellt haben, haben Sie nicht daran gedacht, es os.rmdir('~/something')zu löschen?
Bakuriu
@Bakuriu Schließlich ich tat Figur , die aus
UniversallyUniqueID

Antworten:

73

Entfliehen Sie dem ~mit \~oder verwenden Sie einfache Anführungszeichen '~'. also kannst du

rmdir ~/\~

oder

cd ~ ; rmdir '~'
Marcin Krasowski
quelle
43
Wenn Sie befürchten, etwas zu löschen, das Sie nicht löschen sollten, können Sie zuerst etwas zerstörungsfreies tun, z. B .: mv '~' normalname, und dann das Verzeichnis normalname entfernen.
Chris Jefferson
53
rmdirist zerstörungsfrei. rmdirlöscht nur leere Verzeichnisse. Wenn Sie also versuchen, rmdirein Verzeichnis zu öffnen, in dem sich überhaupt etwas befindet, rmdirwird es abgelehnt, es zu löschen.
Hitechcomputergeek
3
Sie müssen nicht einmal die Tilde in der ersten dieser Befehle zu entkommen - ~wird speziell nur am Anfang einer Shell "Wort" erweitert.
Henning Makholm
1
Sie können sogar nur rmdir *. Da nur leere Verzeichnisse entfernt werden, müssen Sie sich keine Sorgen darüber machen, dass etwas zerstörerisch wird.
Benubird
@ChrisJefferson: Wenn Sie Ihren Befehl zuerst überprüfen möchten, überprüfen Sie mit ls -d, ob er das gewünschte Verzeichnis oder die gewünschte Datei enthält. Keine Notwendigkeit für etwas mit einem Effekt wie mv.
Peter Cordes
42

Was Python gibt, nimmt Python weg:

$ python -c 'import os; os.makedirs("~/foo")'; tree; python -c 'import os; os.removedirs("~/foo")'; tree
.
└── ~
    └── foo

2 directories, 0 files
.

0 directories, 0 files

Wenn Sie dies getan haben os.mkdir, können Sie es mit os.rmdir(und ähnlich für os.makedirsund os.removedirs) rückgängig machen .

muru
quelle
36

Sie können den Verzeichnisnamen entweder mit einem umgekehrten Schrägstrich wie folgt umgehen (vorausgesetzt, Sie befinden sich im übergeordneten Verzeichnis des zu löschenden Verzeichnisses):

rmdir \~

Oder Sie können relative Pfade mit einem Punkt als aktuelles Verzeichnis verwenden (auch im übergeordneten Verzeichnis):

rmdir ./~

Oder Sie können den vollständigen absoluten Pfad verwenden:

rmdir /home/USERNAME/~

Und keine Sorge, rmdirkann nur leere Verzeichnisse entfernen. Wenn Sie versehentlich den Befehl und den Pfad falsch eingeben, um Ihr reales Ausgangsverzeichnis zu ermitteln, besteht keine Gefahr, da er Dateien enthält:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
Byte Commander
quelle
Ich mag die relative Pfadoption. Es sollte unmöglich sein, eine Zuordnung ./~zu erstellen ~/, unabhängig davon, in welchem ​​Verzeichnis Sie sich gerade befinden. Ähnliches gilt für den vollständigen absoluten Pfad.
MBraedley
2

findBefehl kann solche Wunder tun. Der Befehl

ls -i

Gibt Ihnen die Inode-Nummer der Dateien oder des Verzeichnisses. Dann können Sie findsolche Dateien oder Verzeichnisse löschen mit:

find . -inum <inode-number> -delete #for a file

und

find . -inum <inode-number> -exec rm -rf {}\; #for directories
user2763554
quelle
1

Was hätte getan werden sollen

Sie sollten home=os.path.expanduser("~")zuerst und dann durchgeführt haben os.path.join(home,"something"). Das ~wird in Python als Text behandelt und nicht wie in bashoder in anderen Shells erweitert.

$ python -c 'import os;home=os.path.expanduser("~"); os.mkdir(os.path.join(home,"something"))'                                                                                          

$ ls -ld ~/something
drwxrwxr-x 2 xieerqi xieerqi 4096 7月  12 21:00 /home/xieerqi/something/

Wie man es los wird

Zusätzlich zu den bereits erwähnten Methoden können wir hex-Werte ~aus der ASCII-Zeichentabelle verwenden, die im Gegensatz zu actual ~nicht auf das Benutzerverzeichnis in der Befehlszeile ausgedehnt werden (falls Sie sich fragen, wann Tilde am Anfang von erscheint) ein Wort, es erweitert sich zum Home-Verzeichnis des Benutzers. Vergleichen Sie ls ~und ls $'\x7e').

So würde es funktionieren:

# Make the directory
$ mkdir ./~                                                                                                                                                                             
$ stat ./$'\x7e'                                                                                                                                                                        
  File: './~'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 5768019     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/ xieerqi)   Gid: ( 1000/ xieerqi)
Access: 2017-07-12 21:05:31.382828424 -0600
Modify: 2017-07-12 21:05:31.382828424 -0600
Change: 2017-07-12 21:05:31.382828424 -0600
 Birth: -

# and remove it 
$ rmdir ./$'\x7e'                                                                                                                                                                       
$ ls $'\x7e'
ls: cannot access '~': No such file or directory
Sergiy Kolodyazhnyy
quelle