When exiting a file as root, I typed :x!~ and hit enter. Now I have the following:

root@host:/etc/shinken/services$ ll
total 64K
-rw-r--r--  1     0     0  515 Sep  1 18:24 ~
drwxr-xr-x  2 10003 10003 4.0K Sep  1 18:24 .
drwxr-xr-x 29 10003 10003 4.0K Aug  8 17:11 ..
<other files omitted> 

If I cd ~, it takes me to /root as expected. How can I delete the new ~ without accidentally deleting my actual home?

2 Answers 2

cd /etc/shinken/services
rm ./~

Not much to say about that really. By specifying ./ in front of ~ you stop the shell from performing tilde expansion, and it will be treated as the name of a file in the current directory.

Another option would have been

cd /etc/shinken/services
rm '~'

or just

rm /etc/shinken/services/~

In Vi and Vim, :x will work like :wq and write the file before quitting. By appending a filename (~ in this case), the file with the given name will be written. The difference between the two commands is that :x only writes the file if the current buffer has been modified since the last save. The ! overrides writing to a read-only file.

  • oh... right.... duh.. :)
    – MrDuk
    Sep 1, 2017 at 18:39
rm -- '~'

The single quotes around the ~ stop bash from expanding the path and simply passes it to rm.

-- stops rm from interpreting any more arguments as flags and assumes they are all files (no so important in this case but useful if you have a file with a leading -).

You can test this with ls first.

ls -- '~'

For example in a directory that does not contain a literal '~' you would get

ls: cannot access '~': No such file or directory

Showing that ls has received the path unmodified.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .