Przypadkowo utworzony katalog o nazwie „~” (tylda)

47

Udało mi się stworzyć katalog o nazwie dosłownie~ .

(Najwyraźniej Python os.mkdir('~/something')robi to.)

Jak mogę go usunąć, nie nukając domu?

Ponadto, jeśli to pomoże, mam swoją prawdziwą /homena osobnej partycji. A duplikat ~znajduje się w ( rzeczywistym ) ~.

UniversallyUniqueID
źródło
51
Obowiązkowe XKCD . Ok, mogłem skłamać, że jest to obowiązkowe. I będąc XKCD.
Jesvin Jose,
30
Aby odpowiedzieć na pytanie w języku Python, którego w przyszłości nie zadałeś, użyj os.mkdir(os.path.expanduser('~/something')).
Matt Nordhoff,
8
... tylko z ciekawości, skoro stworzyłeś katalog w Pythonie, czy nie pomyślałeś, aby go os.rmdir('~/something')usunąć?
Bakuriu,
@Bakuriu Ostatecznie ja zrobiłem tego dowiedzieć
UniversallyUniqueID

Odpowiedzi:

73

Ucieczka ~z \~lub używać apostrofów '~'. więc możesz

rmdir ~/\~

lub

cd ~ ; rmdir '~'
Marcin Krasowski
źródło
43
Jeśli martwisz się usunięciem czegoś, czego nie powinieneś, możesz najpierw zrobić coś nieniszczącego, na przykład: mv '~' normalname, a następnie usunąć katalog normalname.
Chris Jefferson,
53
rmdirjest nieniszczący. rmdirusunie tylko katalogi, które są puste, więc jeśli spróbujesz przejść do rmdirdowolnego katalogu, w którym coś jest w ogóle, rmdirodmówisz jego usunięcia.
Hitechcomputergeek
3
Nie musisz nawet uciekać przed tyldy w pierwszym z tych poleceń - ~jest specjalnie rozwinięty tylko na początku „słowa” powłoki.
Henning Makholm
1
Możesz nawet po prostu rmdir *. Ponieważ usuwa tylko puste katalogi, nie musisz się martwić, że spowoduje to destrukcję.
Benubird
@ChrisJefferson: Jeśli chcesz najpierw sprawdzić swoje polecenie, użyj, ls -daby zobaczyć, czy zawiera ono katalog lub plik, który chcesz. Nie potrzeba niczego z efektem podobnym do mv.
Peter Cordes,
42

Co daje Python, odbiera:

$ 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

Jeśli tak os.mkdir, możesz cofnąć to za pomocą os.rmdir(i podobnie dla os.makedirsi os.removedirs).

muru
źródło
36

Możesz albo zmienić nazwę katalogu, używając odwrotnego ukośnika (zakładając, że działasz w katalogu nadrzędnym katalogu, który chcesz usunąć):

rmdir \~

Lub możesz użyć ścieżek względnych z kropką jako katalogu bieżącego (również gdy znajduje się w katalogu nadrzędnym):

rmdir ./~

Lub możesz użyć pełnej ścieżki bezwzględnej:

rmdir /home/USERNAME/~

I nie martw się, rmdirmożesz usunąć tylko puste katalogi. Jeśli przypadkowo wpiszesz polecenie, a ścieżka zmieni się w prawdziwy katalog domowy, nie jest to niebezpieczne, ponieważ zawiera pliki:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
Bajt Dowódca
źródło
Podoba mi się opcja ścieżki względnej. To powinno być niemożliwe do mapy ./~, aby ~/, niezależnie od katalogu w którym aktualnie jesteś. Podobna sytuacja z pełną ścieżkę bezwzględną.
MBraedley,
2

findrozkaz może czynić takie cuda. Komenda

ls -i

da ci i-węzła liczbę plików lub katalogu. Następnie możesz użyć finddo usunięcia takich plików lub katalogu za pomocą:

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

i

find . -inum <inode-number> -exec rm -rf {}\; #for directories
użytkownik2763554
źródło
1

Co należało zrobić

Powinieneś był wykonać home=os.path.expanduser("~")najpierw, a potem os.path.join(home,"something"). W ~Pythonie jest traktowany jak tekst i nie rozwija się tak jak w bashinnych powłokach.

$ 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/

Jak się tego pozbyć

Oprócz wspomnianych już metod, możemy użyć wartości szesnastkowej ~z tabeli znaków ascii, która w przeciwieństwie do faktycznej ~nie rozwija się do katalogu domowego użytkownika w wierszu poleceń (w przypadku, gdy zastanawiasz się, kiedy tylda pojawia się na początku słowo, rozwija się do katalogu domowego użytkownika. Porównaj ls ~i ls $'\x7e').

Oto jak to będzie działać:

# 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
źródło