我想将一个文件从 A 复制到 B,它可能位于不同的文件系统上。
还有一些额外的要求:
我认为这很接近:
cp A B.part && \
ln B B.part && \
rm B.part
Run Code Online (Sandbox Code Playgroud)
但是 3. 如果 B.part 存在(即使使用 -n 标志),则 cp 不会失败。随后 1. 如果另一个进程“赢得”cp 并且链接到位的文件不完整,则可能会失败。B.part 也可能是一个不相关的文件,但我很高兴在这种情况下没有尝试其他隐藏名称而失败。
我认为 bash noclobber 有帮助,这是否完全有效?有没有办法在没有 bash 版本要求的情况下获得?
#!/usr/bin/env bash
set -o noclobber
cat A > B.part && \
ln B.part B && \
rm B.part
Run Code Online (Sandbox Code Playgroud)
后续,我知道一些文件系统无论如何都会失败(NFS)。有没有办法检测这样的文件系统?
其他一些相关但不完全相同的问题:
有没有办法在 eMMC 上以原子方式将文件和目录从 tempfs 移动到 ext4 分区
https://rcrowley.org/2010/01/06/things-unix-can-do-atomically.html
如果我不使用 --inplace 选项,我很难找到 Rsync 如何“选择”复制文件时创建的临时文件的扩展名。
示例:我想用 Rsync复制sourceDirectory/myFile.txt
到targetDirectory/
。
虽然复制myFile.txt
到targetDirectory/
Rsync的将创建一个名为文件.myFile.txt.W4zvLi
在targetDirectory/
。
然后 Rsync 将重命名.myFile.txt.W4zvLi
为myFile.txt
.
问题是为什么 Rsync 使用W4zvLi
扩展以及为什么每次执行 Rsync 程序时它似乎都会改变?