How to delete all but one file in Unix? [duplicate]

Solution 1:

ls * | grep -v dont_delete_this_file | xargs rm -rf 

Example :

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

To remove all files except 'test2' :

ls * | grep -v test2 | xargs rm -rf

Then 'ls' output is :

test2

EDIT:

Thanks for the comment. If the directory contains some files with spaces :

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

You can use (with bash) :

rm !("test 1"|"test 4")

'ls' output :

test 1
test 4

Solution 2:

Assuming you're using the bash shell (the most common case), you can use the negation globbing (pathname expansion) symbol:

rm -rf !(myfile.txt)

This uses extended globbing, so you would need to enable this first:

shopt -s extglob

Solution 3:

 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .

Solution 4:

ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt