How to swap filenames in Unix? How to swap filenames in Unix? unix unix

How to swap filenames in Unix?


This can be done with little helper, just put in .bashrc, .zshrc or where your configs.

function swap() { mv "$1" "$1._tmp" && mv "$2" "$1" && mv "$1._tmp" "$2"; }

And use it as regular function:

$ cat a bAlfaBeta$ swap a b && cat a bBetaAlfa


Darwin/Mac OS X has the exchangedata() system call:

The exchangedata() function swaps the contents of the files referenced by path1 and path2 in an atomic fashion. That is, all concurrent processes will either see the pre-exchanged state or the post-exchanged state; they can never see the files in an inconsistent state.

However it only actually works on a few filesystems that specifically support it (such as Apple's HFS and HFS+), and I haven't seen any similar system call on other systems. The portable way to do this is using a third temporary file name, and the operation will not be atomic.


ok, stupid question, but why can't you simply do something like (in a shell script):

mv $fileA $fileA.$$mv $fileB $fileAmv $fileA.$$ $fileB

and yes of course it uses a temporary file, but its more concise then the other answers.