mv command - don't overwrite files

I want to mv files and not overwrite duplicates. The -b switch only makes a single backup file, whereas I may have many.

According to the mv man page:

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. The version control method may be selected via the --backup option or through the VERSION_CONTROL environment variable. Here are the values:

none, off: never make backups (even if --backup is given)
numbered, t: make numbered backups
existing, nil: numbered if numbered backups exist, simple otherwise
simple, never: always make simple backups

I think I want to use the 'existing, nil' option... but I can't figure out how to call that.

If my command is:

mv $src $dest

How can I implement the 'existing, nil' option?


To enable existing or nil (or any of the other options), pass them as values for the --backup option:

mv --backup=existing "$src" "$dest"
mv --backup=nil "$src" "$dest"

Be warned that this does not do what you want:

$ mkdir foo bar
$ cp blah/* foo
$ cp blah/* bar
$ mv --backup=nil bar/* foo/* -t blah
mv: will not overwrite just-created ‘blah/a.jpg’ with ‘foo/a.jpg’
mv: will not overwrite just-created ‘blah/b.ogv’ with ‘foo/b.ogv’
mv: will not overwrite just-created ‘blah/cd ef.JpG’ with ‘foo/cd ef.JpG’

You actually want numbered/t:

$ mv --backup=numbered bar/* foo/* -t blah
$ ls blah 
a.jpg  a.jpg.~1~  a.jpg.~2~  b.ogv  b.ogv.~1~  b.ogv.~2~  cd ef.JpG  cd ef.JpG.~1~  cd ef.JpG.~2~