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. :-)



Reply via email to