Directory creata accidentalmente denominata "~" (tilde)


47

Sono riuscito a creare una directory chiamata letteralmente~ .

(Apparentemente, Python os.mkdir('~/something')fa questo.)

Come lo rimuovo senza danneggiare la mia casa?

Inoltre, se aiuta, ho il mio reale /homesu una partizione separata. E il duplicato ~si trova in (il reale ) ~.


51
XKCD obbligatorio . Ok, potrei aver mentito sul fatto che fosse obbligatorio. Ed essere un XKCD.
Jesvin Jose,

30
Per rispondere alla domanda Python che non hai posto, in futuro, usa os.mkdir(os.path.expanduser('~/something')).
Matt Nordhoff,

8
... solo per curiosità, dato che hai creato la directory in Python non hai pensato di fare os.rmdir('~/something')per eliminarla?
Bakuriu,

@Bakuriu Alla fine, mi ha fatto capire che fuori
UniversallyUniqueID

Risposte:


73

Sfuggire a ~con \~o utilizzare virgolette singole '~'. così puoi

rmdir ~/\~

o

cd ~ ; rmdir '~'

43
Se sei preoccupato di eliminare qualcosa che non dovresti, puoi prima fare qualcosa di non distruttivo come: mv '~' nome normale, quindi rimuovere la directory nome normale.
Chris Jefferson,

53
rmdirè non distruttivo. rmdireliminerà solo le directory vuote, quindi se si tenta di accedere a rmdiruna directory che contiene qualcosa, rmdirsi rifiuterà di eliminarla.
Hitechcomputergeek

3
Non è nemmeno necessario sfuggire alla tilde nel primo di questi comandi: ~viene espanso specialmente all'inizio di una "parola" di shell.
Henning Makholm,

1
Puoi anche solo rmdir *. Poiché rimuove solo le directory vuote, non devi preoccuparti che faccia qualcosa di distruttivo.
Benubird,

@ChrisJefferson: se vuoi prima controllare il tuo comando, usa ls -dper vedere se elenca la directory o il file che desideri. Non c'è bisogno di nulla con un effetto simile mv.
Peter Cordes,

42

Cosa offre Python, Python toglie:

$ 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 lo facessi os.mkdir, potresti annullarlo con os.rmdir(e similmente per os.makedirse os.removedirs).


36

Puoi sfuggire al nome della directory usando una barra rovesciata come questa (supponendo che stai operando nella directory principale di quella che desideri eliminare):

rmdir \~

Oppure puoi usare percorsi relativi con un punto come directory corrente (anche quando si trova nella directory padre):

rmdir ./~

Oppure puoi usare il percorso assoluto completo:

rmdir /home/USERNAME/~

E non preoccuparti, rmdirpuoi solo rimuovere le directory vuote. Se si digita erroneamente il comando e il percorso viene valutato nella directory principale reale, non è in pericolo perché contiene file:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty

Mi piace l'opzione relativa al percorso. Dovrebbe essere possibile mappare ./~a ~/, indipendentemente da quale directory si è attualmente in. Situazione simile con il percorso assoluto completo.
MBraedley,

2

findil comando può fare tali miracoli. Il comando

ls -i

ti darà il numero di inode di file o directory. Quindi è possibile utilizzare findper eliminare tali file o directory utilizzando:

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

e

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

1

Cosa avrebbe dovuto essere fatto

Avresti dovuto esibirti home=os.path.expanduser("~")prima e poi os.path.join(home,"something"). Il ~è trattata come testo in pitone e non si espande, come invece accade in basho altre shell.

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

Come sbarazzarsene

Oltre ai metodi già menzionati, possiamo usare il valore esadecimale ~dalla tabella dei caratteri ascii, che a differenza di effettiva ~non si espande nella home directory dell'utente sulla riga di comando (Nel caso ti stia chiedendo, quando tilde appare all'inizio di una parola, si espande nella home directory dell'utente. Confronta ls ~e ls $'\x7e').

Ecco come funzionerebbe:

# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.