Diretório criado acidentalmente chamado “~” (til)

47

Consegui criar um diretório chamado literalmente~ .

(Aparentemente, o Python os.mkdir('~/something')faz isso.)

Como removê-lo sem danificar minha casa?

Além disso, se ajudar, tenho o meu real /homeem uma partição separada. E a duplicata ~está localizada em (o real ) ~.

UniversallyUniqueID
fonte
51
XKCD obrigatório . Ok, eu posso ter mentido sobre isso ser obrigatório. E sendo um XKCD.
Jesvin Jose
30
Para responder à pergunta do Python que você não pediu, no futuro, use os.mkdir(os.path.expanduser('~/something')).
Matt Nordhoff
8
... só por curiosidade, desde que você criou o diretório em python, você não pensou os.rmdir('~/something')em excluí-lo?
Bakuriu 9/04/16
@Bakuriu Eventualmente, eu fiz descobrir isso
UniversallyUniqueID

Respostas:

73

Escape do ~com \~ou use aspas simples '~'. então você pode

rmdir ~/\~

ou

cd ~ ; rmdir '~'
Marcin Krasowski
fonte
43
Se você estiver preocupado em excluir algo que não deveria, primeiro faça algo não destrutivo como: mv '~' normalname e remova o diretório normalname.
Chris Jefferson
53
rmdiré não destrutivo. rmdirexcluirá apenas diretórios vazios; portanto, se você tentar rmdirqualquer diretório que contenha alguma coisa, rmdirrecusará excluí-lo.
Hitechcomputergeek
3
Você nem precisa escapar do til no primeiro desses comandos - ~é expandido especialmente apenas no início de uma "palavra" do shell.
Henning Makholm
11
Você pode até mesmo rmdir *. Como ele remove apenas diretórios vazios, você não precisa se preocupar em fazer algo destrutivo.
precisa saber é o seguinte
@ ChrisJefferson: Se você deseja verificar seu comando primeiro, use ls -dpara ver se ele lista o diretório ou arquivo que você deseja. Não há necessidade de nada com um efeito parecido mv.
Peter Cordes
42

O que o python fornece, o python tira:

$ 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

Se você fez os.mkdir, você pode desfazê-lo com os.rmdir(e da mesma forma para os.makedirse os.removedirs).

muru
fonte
36

Você pode escapar do nome do diretório usando uma barra invertida como esta (supondo que você esteja operando no diretório pai daquele que deseja excluir):

rmdir \~

Ou você pode usar caminhos relativos com um ponto como o diretório atual (também quando localizado no diretório pai):

rmdir ./~

Ou você pode usar o caminho absoluto completo:

rmdir /home/USERNAME/~

E não se preocupe, você rmdirpode remover apenas diretórios vazios. Se você digitar acidentalmente o comando e o caminho for avaliado para o diretório inicial real, ele não estará em perigo porque contém arquivos:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
Byte Commander
fonte
Eu gosto da opção de caminho relativo. Deve ser impossível para mapear ./~para ~/, independentemente de qual diretório você está atualmente em. Situação semelhante com o caminho absoluto completo.
MBraedley
2

findcomando pode fazer esses milagres. O comando

ls -i

lhe dará um número inode de arquivos ou diretório. Em seguida, você pode usar findpara excluir esses arquivos ou diretório usando:

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

e

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

O que deveria ter sido feito

Você deveria ter realizado home=os.path.expanduser("~")primeiro e depois os.path.join(home,"something"). O ~texto é tratado como texto em python e não se expande como em bashoutros shells.

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

Como se livrar dele

Além dos métodos já mencionados, podemos usar o valor hexadecimal ~da tabela de caracteres ascii, que, diferentemente do real, ~não se expande para o diretório inicial do usuário na linha de comando (caso você esteja se perguntando, quando til aparece no início de uma palavra, ela se expande para o diretório inicial do usuário. Compare ls ~e ls $'\x7e').

Veja como isso funcionaria:

# 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
fonte