`tail -F` should already do this.
Create an empty `/tmp/t/file`. Then, in terminal 1, start `tail -F`, and leave it running:
anthony@Zia:~$ tail -F /tmp/t/file
a
b
tail: `/tmp/t/file' has become inaccessible: No such file or directory
tail: `/tmp/t/file' has appeared; following end of new file
c
d
In terminal 2, I did:
anthony@Zia:/tmp/t$ echo a >> file
anthony@Zia:/tmp/t$ echo b >> file
anthony@Zia:/tmp/t$ mv -i file file.old; echo c >> file
anthony@Zia:/tmp/t$ echo d >> file
As you can see, `tail -F` does indeed follow the name, not the inode. Maybe you're using a `tail` that gives different meaning to `-F` (that flag is a BSD extension, copied later by GNU as well), or your version is buggy? You could also try `tail --follow=name --retry` (GNU tail alternate syntax) or `xtail` (which tails an entire directory).