mv:将 <旧名称> 重命名为 <新名称>/<旧名称>:参数无效

J.L*_*ski 7 shell freebsd zsh mv

在我的 TrueNAS (FreeBSD 13.1) 服务器上,我有一个名为OldHDD我想要重命名的目录,但出现错误:

% mv OldHDD oldhdd
mv: rename OldHDD to oldhdd/OldHDD: Invalid argument
Run Code Online (Sandbox Code Playgroud)

我尝试了该命令的不同变体,但没有一个有效:

% mv ./OldHDD oldhdd
mv: rename ./OldHDD to oldhdd/OldHDD: Invalid argument

% mv -- OldHDD oldhdd
mv: rename OldHDD to oldhdd/OldHDD: Invalid argument

% mv /full/path/to//OldHDD /full/path/to/oldhdd
mv: rename /full/path/to/OldHDD to /full/path/to/oldhdd/OldHDD: Invalid argument
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用mmv,即使它不报告错误,目录名称也不会改变:

% ls
total 1
drwxr-xr-x  3 user  group     3B Apr 10 21:50 OldHDD

% mmv -rv OldHDD oldhdd
OldHDD -> oldhdd : done

% ls
total 1
drwxr-xr-x  3 user  group     3B Apr 10 21:50 OldHDD
Run Code Online (Sandbox Code Playgroud)

我认为目录内容可能有问题,但我可以重命名它包含的子目录就好。

我尝试复制目录以检查元数据是否会导致问题,但复制的目录仍然存在相同的问题。

我唯一一次成功重命名该目录是当我:(1)(错误地)OldHDD仅创建了一个子目录的部分副本,以及(2)在OldHDD. 但由于原始目录的大小,我犹豫是否要创建原始目录的 tar 存档。

有人可以解释一下如何重命名这个目录以及这里发生了什么吗?

Gil*_*il' 30

NAS 上的文件系统不区分大小写\xc2\xb9,因此OldHDDoldhdd是同一个文件。但您的操作系统区分大小写,因此它会考虑这些不同的名称。该mv命令询问文件系统目标是否oldhdd是现有目录,答案是肯定的,因为这只是OldHDD. 因此mv尝试将源移至此现有目录中。但源是同一个目录,因此这是使目录成为其自身子目录的尝试,文件系统拒绝这样做。

\n

要以仅更改不区分大小写的文件系统上的大小写的方式重命名文件,请使用不区分大小写的中间名称重命名两次。

\n
mv OldHDD oldhdd.temp_name\nmv oldhdd.temp_name oldhdd\n
Run Code Online (Sandbox Code Playgroud)\n

\xc2\xb9但它是保留大小写的:它会记住它存储的名称的大小写。OldHDDoldhdd是拼写相同文件名的不同方式,但文件系统会记住哪种拼写是所需的拼写。

\n