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