Linux 移动文件而不替换(如果文件存在)

aan*_*est 2 linux mv

在 Linux 中,如果目标中已存在特定文件,如何在不替换的情况下移动文件?

我尝试了以下命令:

mv --backup=t <source> <dest>
Run Code Online (Sandbox Code Playgroud)

该文件不会被替换,但问题是扩展名被更改,因为它将“~”放在文件名后面。

有没有其他方法可以保留扩展名,但在移动时仅更改文件名?

例如 test~1.txt代替test.txt~1

当扩展名被替换后,您将无法通过双击来查看文件。

Bas*_*tch 5

如果您想在 shell 中进行操作,而不需要原子性(因此,如果两个 shell 进程同时运行相同的代码,您可能会遇到麻烦),您只需使用shell 的内置test(1)功能即可)

[ -f destfile.txt ] || mv srcfile.txt destfile.txt
Run Code Online (Sandbox Code Playgroud)

如果您需要原子性(当两个进程同时运行它时起作用),事情会非常困难,您需要在 C 中调用一些系统调用。查看renameat2(2)

也许您应该考虑使用一些版本控制系统,例如git