如何在Unix中交换文件名?

vol*_*lni 6 unix filenames swap

如何在不使用临时变量的情况下快速完成此操作?有内置功能吗?

编辑:谢谢你们的答案.看起来我需要澄清我的问题,但大多数情况下你们假设正确:有两个文件,文件名名称相反.

  • 文件A的名称为B-name.file
  • 文件B的名称为A-name.file

我希望将文件A命名为A-name.file,将文件B命名为B-name.file.

我同意,情况不会经常发生,但它只是发生在我身上,我想快速解决.

mar*_*k4o 9

Darwin/Mac OS X有exchangedata()系统调用:

该exchangedata()函数以原子方式交换path1和path2引用的文件的内容.也就是说,所有并发进程将看到预交换状态或后交换状态; 他们永远不会看到处于不一致状态的文件.

然而,它实际上只适用于一些专门支持它的文件系统(例如Apple的HFS和HFS +),而且我还没有在其他系统上看到任何类似的系统调用.可执行此操作的可移植方法是使用第三个临时文件名,操作不是原子操作.


Son*_*que 9

这可以用小帮手完成,只需放入.bashrc,.zshrc或你的配置.

function swap() { mv $1 $1._tmp && mv $2 $1 && mv $1._tmp $2; }
Run Code Online (Sandbox Code Playgroud)

并将其用作常规功能:

$ cat a b
Alfa
Beta

$ swap a b && cat a b
Beta
Alfa
Run Code Online (Sandbox Code Playgroud)


enn*_*ler 5

好的,愚蠢的问题,但是为什么不能简单地做一些事情(在shell脚本中):

mv $fileA $fileA.$$
mv $fileB $fileA
mv $fileA.$$ $fileB
Run Code Online (Sandbox Code Playgroud)

是的,它当然使用了一个临时文件,但是比其他答案更简洁。

  • 它使用一个临时文件名,但至少没有进行复制。 (4认同)