bug#81377: mv -Tn suceeds if target directory exists, no error printed

Pádraig Brady <[email protected]> Wed, 8 Jul 2026 19:07:46 +0100
Newsgroups gmane.comp.gnu.core-utils.bugs
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------QjFFdvy4nHjKa70PJ5tQrMN3
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

On 08/07/2026 13:51, Florian Weimer via GNU coreutils Bug Reports wrote:
> * Florian Weimer via:
> 
>> Based on the documentation, I would have expected an error in this case.
>>
>> mkdir a a/1 b b/2
>> mv -Tn a b
>>
>> Exit status is zero.  The only relevant system call in the strace output
>> is this one:
>>
>> renameat2(AT_FDCWD, "a", AT_FDCWD, "b", RENAME_NOREPLACE) = -1 EEXIST (File exists)

Right the documentation got out of sync a bit.

We changed the behavior to exiting with failure in:
https://github.com/coreutils/coreutils/commit/7a69df889
Though there was push back on that due to scripts breaking,
so it was reverted in:
https://github.com/coreutils/coreutils/commit/9907b6f5d

However I failed to update the mv -n info docs accordingly.

In some quick testing here I see mv -n silently fails on solaris,
but (like Linux) silently skips on FreeBSD.
So we should deprecate (non POSIX) -n for mv as we've
already done for cp.

I'll push the attached to address this documentation issue.

>>
>> Seen with: coreutils-9.7-9.fc43.x86_64
> 
> I see that there is a hint in the -n description that the exit status
> may not be what users expects.  But it means that this claim in the
> manual is slightly misleading:
> 
> | However, if ‘mv -T /tmp/source /tmp/dest’ succeeds, there is no
> | question that ‘/tmp/source’ was renamed to ‘/tmp/dest’.

The above is OK I think, as it doesn't mention -n.

Marking this as done.

thanks,
Padraig
--------------QjFFdvy4nHjKa70PJ5tQrMN3
Content-Type: text/x-patch; charset=UTF-8; name="mv-n-doc.patch"
Content-Disposition: attachment; filename="mv-n-doc.patch"
Content-Transfer-Encoding: base64

RnJvbSA1MzkyNmJhN2Q4N2UyOThiYTgzNjE2ODFkMjlmNmZlZmQyNTZiMDgyIE1vbiBTZXAg
MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/UD1DMz1BMWRyYWlnPTIwQnJhZHk/
PSA8UEBkcmFpZ0JyYWR5LmNvbT4KRGF0ZTogV2VkLCA4IEp1bCAyMDI2IDE4OjU1OjM0ICsw
MTAwClN1YmplY3Q6IFtQQVRDSF0gZG9jOiBmaXggZGVzY3JpcHRpb24gb2YgbXYgLW4KClRo
ZSBkZXNjcmlwdGlvbiBvZiBtdiAtLW5vLWNsb2JiZXIgZ290IG91dCBvZiBzeW5jCmJldHdl
ZW4gY29tbWl0IHY5LjEtMTMzLWc3YTY5ZGY4ODkgYW5kIHY5LjQtMTM0LWc5OTA3YjZmNWQK
CiogZG9jL2NvcmV1dGlscy50ZXhpIChtdiBpbnZvY2F0aW9uKTogQ29weSBtb3N0IG9mIHRo
ZSAtbgpkZXNjcmlwdGlvbiBmcm9tIHRoZSBjcCAtLW5vLWNsb2JiZXIgZGVzY3JpcHRpb24u
Ciogc3JjL212LmMgKHVzYWdlKTogTGlrZXdpc2UuICBOb3RlIHRoaXMgZXhwbGljaXRseSBk
ZXByZWN0YXRlcwp0aGUgbXYgLW4gb3B0aW9uIGFzIGxpa2UgY3AgdGhlIGV4aXQgY29kZSB2
YXJpZXMgYWNyb3NzIHBsYXRmb3Jtcy4KU29sYXJpcyAxMSB3YXMgc2VlbiB0byBzaWxlbnRs
eSBmYWlsLCB3aGlsZSBMaW51eC9GcmVlQlNEIHN1Y2NlZWQuCkZpeGVzIGh0dHBzOi8vYnVn
cy5nbnUub3JnLzgxMzc3Ci0tLQogZG9jL2NvcmV1dGlscy50ZXhpIHwgMjQgKysrKysrKysr
KysrKystLS0tLS0tLS0tCiBzcmMvbXYuYyAgICAgICAgICAgfCAgMiArLQogMiBmaWxlcyBj
aGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCAxMSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg
YS9kb2MvY29yZXV0aWxzLnRleGkgYi9kb2MvY29yZXV0aWxzLnRleGkKaW5kZXggMjliYWY1
NzEwLi5kM2UzNzIzYzEgMTAwNjQ0Ci0tLSBhL2RvYy9jb3JldXRpbHMudGV4aQorKysgYi9k
b2MvY29yZXV0aWxzLnRleGkKQEAgLTg4NzUsMTUgKzg4NzUsMjQgQEAgdG8gY2F1c2UgQGNv
bW1hbmR7Y3B9IHdyaXRlIHRvIGFyYml0cmFyeSB0YXJnZXQgZGlyZWN0b3JpZXMuCiBAb3B0
SXRlbXh7Y3AsLS1saW5rLH0KIE1ha2UgaGFyZCBsaW5rcyBpbnN0ZWFkIG9mIGNvcGllcyBv
ZiBub24tZGlyZWN0b3JpZXMuCiAKLUBvcHRJdGVte2NwLC1uLH0KLUBvcHRJdGVteHtjcCwt
LW5vLWNsb2JiZXIsfQorQG1hY3JvIG5vQ2xvYmJlck9wdGlvbntjbWR9CitAb3B0SXRlbXtc
Y21kXCwtbix9CitAb3B0SXRlbXh7XGNtZFwsLS1uby1jbG9iYmVyLH0KK0BjaW5kZXggcHJv
bXB0cywgb21pdHRpbmcKIERvIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZTsgc2ls
ZW50bHkgc2tpcCBpbnN0ZWFkLgorQGlmc2V0IE1WX0NPTU1BTkQKK0Btdk9wdHNJZm4KK0Bl
bmQgaWZzZXQKK0BpZmNsZWFyIE1WX0NPTU1BTkQKIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyBh
IHByZXZpb3VzIEBvcHRpb257LWl9IG9wdGlvbi4KK0BlbmQgaWZjbGVhcgogVGhpcyBvcHRp
b24gaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggQG9wdGlvbnstYn0gb3IgQG9wdGlvbnst
LWJhY2t1cH0gb3B0aW9uLgogVGhpcyBvcHRpb24gaXMgZGVwcmVjYXRlZCBkdWUgdG8gaGF2
aW5nIGEgZGlmZmVyZW50IGV4aXQgc3RhdHVzIGZyb20KIG90aGVyIHBsYXRmb3Jtcy4gIFNl
ZSBhbHNvIHRoZSBAb3B0aW9uey0tdXBkYXRlfSBvcHRpb24gd2hpY2ggd2lsbAogZ2l2ZSBt
b3JlIGNvbnRyb2wgb3ZlciBob3cgdG8gZGVhbCB3aXRoIGV4aXN0aW5nIGZpbGVzIGluIHRo
ZSBkZXN0aW5hdGlvbiwKIGFuZCBvdmVyIHRoZSBleGl0IHN0YXR1cyBpbiBwYXJ0aWN1bGFy
LgorQGVuZCBtYWNybworQG5vQ2xvYmJlck9wdGlvbntjcH0KIAogQG9wdEl0ZW17Y3AsLXAs
fQogQG9wdEl0ZW14e2NwLC0tcHJlc2VydmUsWz1AdmFye2F0dHJpYnV0ZV9saXN0fV19CkBA
IC0xMDAxNSwxNCArMTAwMjQsOSBAQCBQcm9tcHQgd2hldGhlciB0byBvdmVyd3JpdGUgZWFj
aCBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlLCByZWdhcmRsZXNzCiBvZiBpdHMgcGVybWlz
c2lvbnMsIGFuZCBmYWlsIGlmIHRoZSByZXNwb25zZSBpcyBub3QgYWZmaXJtYXRpdmUuCiBA
bXZPcHRzSWZuCiAKLUBvcHRJdGVte212LC1uLH0KLUBvcHRJdGVteHttdiwtLW5vLWNsb2Ji
ZXIsfQotQGNpbmRleCBwcm9tcHRzLCBvbWl0dGluZwotRG8gbm90IG92ZXJ3cml0ZSBhbiBl
eGlzdGluZyBmaWxlOyBzaWxlbnRseSBmYWlsIGluc3RlYWQuCi1AbXZPcHRzSWZuCi1UaGlz
IG9wdGlvbiBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBAb3B0aW9uey1ifSBvciBAb3B0
aW9uey0tYmFja3VwfSBvcHRpb24uCi1TZWUgYWxzbyB0aGUgQG9wdGlvbnstLXVwZGF0ZT1u
b25lfSBvcHRpb24gd2hpY2ggd2lsbAotc2tpcCBleGlzdGluZyBmaWxlcyBidXQgbm90IGZh
aWwuCitAc2V0IE1WX0NPTU1BTkQKK0Bub0Nsb2JiZXJPcHRpb257bXZ9CitAY2xlYXIgTVZf
Q09NTUFORAogCiBAb3B0SXRlbXttdiwtLW5vLWNvcHksfQogQGNpbmRleCByZW5hbWluZyBm
aWxlcyB3aXRob3V0IGNvcHlpbmcgdGhlbQpkaWZmIC0tZ2l0IGEvc3JjL212LmMgYi9zcmMv
bXYuYwppbmRleCBjZDZhYWI0NzMuLjNiYTZmNzAxZSAxMDA2NDQKLS0tIGEvc3JjL212LmMK
KysrIGIvc3JjL212LmMKQEAgLTI4OCw3ICsyODgsNyBAQCBSZW5hbWUgU09VUkNFIHRvIERF
U1QsIG9yIG1vdmUgU09VUkNFKHMpIHRvIERJUkVDVE9SWS5cblwKICIpKTsKICAgICAgIG9w
dXRzIChfKCJcCiAgIC1uLCAtLW5vLWNsb2JiZXJcblwKLSAgICAgICAgIGRvIG5vdCBvdmVy
d3JpdGUgYW4gZXhpc3RpbmcgZmlsZVxuXAorICAgICAgICAgKGRlcHJlY2F0ZWQpIHNpbGVu
dGx5IHNraXAgZXhpc3RpbmcgZmlsZXMuICBTZWUgYWxzbyAtLXVwZGF0ZVxuXAogIikpOwog
ICAgICAgZnB1dHMgKF8oIlwKIElmIHlvdSBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb2YgLWks
IC1mLCAtbiwgb25seSB0aGUgZmluYWwgb25lIHRha2VzIGVmZmVjdC5cblwKLS0gCjIuNTUu
MAoK

--------------QjFFdvy4nHjKa70PJ5tQrMN3--