Is it possible to rename the current working directory from within a shell (Bash in my particular case)? If I attempt to do this the straightforward way, I end up with an error:

nathan@nathan-desktop:/tmp/test$ mv . test2
mv: cannot move ‘.’ to ‘test2’: Device or resource busy

Is there another way to do this without changing the current directory? I realize that I can easily accomplish this by changing to the parent directory, but I'm curious if this is necessary. After all, if I rename the directory from another shell, I can still create files in the original shell afterwards.


Yes, but you have to refer to the directory by name, not by using the . notation. You can use a relative path, it just has to end with something other than . or ..:

/tmp/test$ mv ../test ../test2
/tmp/test$ pwd
/tmp/test$ pwd -P

You can use an absolute path:

/tmp/test$ cd -P .
/tmp/test2$ mv "$PWD" "${PWD%/*}/test3"

Similarly, rmdir . won't ever work, but rmdir "$PWD" does.

  • Perfect... exactly the answer I was hoping for. – Nathan Osman Mar 4 '15 at 0:32
  • 5
    The basic issue is that you're not allowed to remove or rename the special "." and ".." names. – Barmar Mar 4 '15 at 19:26

As in @Gilles answer but using brace expansion for brevity:

mv ../{test,test2}

And it depends on how you define “changing the current directory”.

/tmp/test$ (cd .. && mv test test2)
/tmp/test$ pwd
/tmp/test$ pwd -P

spawns a subshell and changes the current directory in the subshell, but leaves your primary shell where it was.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.