Directorio creado accidentalmente llamado "~" (tilde)

47

Logré hacer un directorio literalmente llamado ~.

(Aparentemente, Python os.mkdir('~/something')hace esto).

¿Cómo lo elimino sin bombardear mi casa?

Además, si ayuda, tengo mi real /homeen una partición separada. Y el duplicado ~se encuentra en (lo real ) ~.

ID universalmente único
fuente
51
Obligatorio XKCD . Ok, puedo haber mentido sobre que es obligatorio. Y ser un XKCD.
Jesvin Jose
30
Para responder la pregunta de Python que no hizo, en el futuro, use os.mkdir(os.path.expanduser('~/something')).
Matt Nordhoff
8
... solo por curiosidad, ya que creaste el directorio en python, ¿no pensaste hacer os.rmdir('~/something')para eliminarlo?
Bakuriu
@Bakuriu el tiempo, me hizo darse cuenta de eso
UniversallyUniqueID

Respuestas:

73

Escápese ~con \~o use comillas simples '~'. así que puedes

rmdir ~/\~

o

cd ~ ; rmdir '~'
Marcin Krasowski
fuente
43
Si le preocupa eliminar algo que no debería, primero puede hacer algo no destructivo como: mv '~' normalname, luego elimine el directorio normalname.
Chris Jefferson el
53
rmdirNo es destructivo. rmdirsolo eliminará los directorios que estén vacíos, por lo que si intenta con rmdircualquier directorio que contenga algo, rmdirse negará a eliminarlo.
Hitechcomputergeek
3
Ni siquiera necesita escapar de la tilde en el primero de estos comandos: ~se expande especialmente solo al comienzo de una "palabra" de shell.
Henning Makholm
1
Incluso puedes simplemente rmdir *. Como solo elimina directorios vacíos, no necesita preocuparse de que haga algo destructivo.
Benubird
@ChrisJefferson: Si primero desea verificar su comando, use ls -dpara ver si muestra el directorio o archivo que desea. No hay necesidad de nada con un efecto como mv.
Peter Cordes
42

Lo que Python da, Python quita:

$ 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

Si lo hiciera os.mkdir, podría deshacerlo con os.rmdir(y de manera similar para os.makedirsy os.removedirs).

muru
fuente
36

Puede escapar del nombre del directorio utilizando una barra invertida como esta (suponiendo que esté operando en el directorio principal del que desea eliminar):

rmdir \~

O puede usar rutas relativas con un punto como el directorio actual (también cuando se encuentra en el directorio principal):

rmdir ./~

O puede usar la ruta absoluta completa:

rmdir /home/USERNAME/~

Y no se preocupe, rmdirsolo puede eliminar directorios vacíos. Si accidentalmente escribe incorrectamente el comando y la ruta se evaluaría en su directorio de inicio real, no está en peligro porque contiene archivos:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
Byte Commander
fuente
Me gusta la opción de ruta relativa. Debe ser imposible asignar ./~a ~/, independientemente de qué directorio te encuentras. Una situación similar con la ruta absoluta completa.
MBraedley
2

findEl comando puede hacer tales milagros. El comando

ls -i

le dará un número de inodo de archivos o directorio. Luego puede usar findpara eliminar dichos archivos o directorios usando:

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

y

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

Lo que debería haberse hecho

Deberías haber actuado home=os.path.expanduser("~")primero y luego os.path.join(home,"something"). El ~se trata como texto en Python y no se expande como lo hace en bashotros 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/

Cómo deshacerse de él

Además de los métodos ya mencionados, podemos usar el valor hexadecimal ~de la tabla de caracteres ascii, que a diferencia del real ~no se expande al directorio de inicio del usuario en la línea de comandos (en caso de que se pregunte, cuando aparece tilde al comienzo de una palabra, se expande al directorio de inicio del usuario. Compare ls ~y ls $'\x7e').

Así es como funcionarí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
fuente