Email or username:

Password:

Forgot your password?
mcc

Is there a way to do `mv`, in either linux or Perl, that will fail if I try to copy a file over another file?

In the mv manpage, I find a `-n` or `--no-clobber` option which does indeed refuse to replace file A with file B. But it is a silent failure. $? is 0 after I run an unsuccessful `mv -n`.

10 comments
Matthew Miller

@mcc

Update to (at least) coreutils 9.2, or use a distro which provides that.

With that version, mv -n will print an error and return 1 if a file is skipped. (Previously, it just printed nothing to indicate it was doing nothing. Insert Drake meme here.)

Matthew Miller

@mcc

There is a new `--update none` option to get the old noclobber behavior, if you want it.

tbh I'm surprised 1) they made what could be a breaking change and 2) to my knowledge there has been no "you broke my scripts" outcry. Although probably the second can be found if I look hard enough.

Also, apparently posix only specifies -i and -f. Because, sure.

Matthew Miller

@mcc

IMHO good for the coreutils maintainers for making some of this stuff make more sense after all of these years.

But I'll wait for the "they hate Unix!" crowd to show up.

lj·rk

@mattdm @mcc Unfortunately `-n` doesn't seem to be race-free though :/

unix.stackexchange.com/questio

With that in mind (if still true), I don't see any worth in a `-n` flag (invoking the "it's not UNIX" meme here :D). Then again, while there are many very bad options added by the GNU project if you ask me (GNU/tar's --checkpoint-action flag springs to mind), but this'd be a really useful flag in principle.

Matthew Miller

@ljrk @mcc

Haven't tested, but I believe that's been fixed sometime after 2015. From the release notes for 8.30 (2018):

``` 'mv -n A B' no longer suffers from a race condition that can
overwrite a simultaneously-created B. This bug fix requires
platform support for the renameat2 or renameatx_np syscalls, found
in recent Linux and macOS kernels. As a side effect, 'mv -n A A'
now silently does nothing if A exists.
[bug introduced with coreutils-7.1]
```

Go Up