GNU bug report logs - #69532
mv's new -x option should be made orthogonal to -t/-T/default

Previous Next

Package: coreutils;

Reported by: Paul Eggert <eggert <at> cs.ucla.edu>

Date: Mon, 4 Mar 2024 00:46:01 UTC

Severity: normal

Done: Paul Eggert <eggert <at> cs.ucla.edu>

Bug is archived. No further changes may be made.

Full log


Message #79 received at 69532 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Bernhard Voelker <mail <at> bernhard-voelker.de>,
 Pádraig Brady <P <at> draigBrady.com>
Cc: 69532 <at> debbugs.gnu.org, util-linux <util-linux <at> vger.kernel.org>,
 Dominique Martinet <asmadeus <at> codewreck.org>, Petr Malat <oss <at> malat.biz>,
 Karel Zak <kzak <at> redhat.com>, Rob Landley <rob <at> landley.net>
Subject: Re: bug#69532: mv's new -x option should be made orthogonal to
 -t/-T/default
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. :-)




This bug report was last modified 1 year and 153 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.