Subject: bug#69532: mv's new -x option should be made orthogonal to -t/-T/default

From: Paul Eggert <[email-masked]>
Date: Wed, 20 Mar 2024 16:56:32 -0700

On 3/20/24 15:53, Bernhard Voelker wrote:

>    $ echo 1 > a
>    $ mkdir d
>    $ echo 2 > d/a
>    $ src/mv -v --exchange a a a d
>    renamed 'a' -> 'd/a'
>    renamed 'a' -> 'd/a'
>    renamed 'a' -> 'd/a'
>    $ cat a
>    2
>    $ src/mv -v --exchange a a a d
>    renamed 'a' -> 'd/a'
>    renamed 'a' -> 'd/a'
>    renamed 'a' -> 'd/a'
>    $ cat a
>    1
>    $ src/mv -v --exchange a a a a d
>    renamed 'a' -> 'd/a'
>    renamed 'a' -> 'd/a'
>    renamed 'a' -> 'd/a'
>    renamed 'a' -> 'd/a'
>    $ cat a
>    1

Yes, that's the expected behavior for this contrived case. Just as one 
would get odd behavior if one did the same thing without --exchange.

> I remember some implementation where mv(1) really was just a rename(2),
> which failed when crossing file systems.  Was it some HP-UX or Solaris mv(1)?

I doubt it. Even 7th Edition 'mv' (1979) fell back on 'cp' when the link 
syscall failed (this was before 'rename' existed).

> My point is that "exchange" is a different functionality.

Yes, but it's closely related. Arguably --backup is also a different 
functionality too (and arguably --exchange is simply an alternative 
backup scheme!) but 'mv' has --backup.

> - How large is the useful overlap with the existing code of mv(1)?
>    Not much: no traditional rename nor copy.

I don't follow this point. The code change was fairly small, which 
indicates there was a lot of overlap with existing functionality.

> - How large is the useful overlap with the existing options/modes of mv(1)?
>    - exchange contradicts --backup,

That could be fixed for regular files, if there's a need, by backing up 
the destination via 'link' before exchanging. For directories it's 
admittedly a problem, but that's also the case for plain 'mv' (or for 
'cp' or 'ln', for that matter) so there's not much new here.

>    - exchange is not useful together with options working with a regular
>      rename of copy, at least: --update, -Z, -n.

It should work with --update and -Z. -n of course is logically 
incompatible, but this not the only set of logically incompatible 
options (e.g., -t vs -T).

>    - not sure if exchange works well together with -f.

What problems do you see there?

> why does exchange not work to exchange a regular with a 
> directory file?

It works. I don't see a problem there.

   $ touch a
   $ mkdir d
   $ ./mv -T --exchange a d
   $ ls -ld a d
   drwxr-xr-x. 2 eggert eggert 4096 Mar 20 16:52 a
   -rw-r--r--. 1 eggert eggert    0 Mar 20 16:52 d

> Finally, the test cases are very sparse:

Feel free to add some. :-)