- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个必须始终存在于文件系统上的硬链接(hard link)。硬链接(hard link)指向的 inode 不是恒定的。我想更新硬链接(hard link)而不向目录添加临时条目。
(创建一个没有目录条目的文件可以使用带有 temp 标志的 open(2)
来完成。)
我面临的问题是替换/更新硬链接(hard link)。从相关系统调用的文档来看,我似乎只有两个选择,而且都没有避免使用临时文件:
使用renameat
,可以确保硬链接(hard link)始终存在。但是,它必须使用硬链接(hard link),因此需要一个临时文件(更不用说它无法取消引用符号链接(symbolic link))。
使用 linkat
,可以在不牺牲另一个文件的情况下生成硬链接(hard link)。但它不能覆盖现有文件;要求删除原来的硬链接(hard link)。
是否有可能创建一个指向 inode 的链接来替换具有相同名称的旧链接?
最佳答案
您需要有另一个文件来切换链接。然而rename
、renameat
不需要inode链接在同一目录下;它们只需要 inode 存在于同一个文件系统上,或者更具体地说,存在于同一个挂载点上;否则 Linux rename
失败并返回 EXDEV
:
EXDEV
oldpath
andnewpath
are not on the same mounted filesystem. (Linux permits a filesystem to be mounted at multiple points, but rename() does not work across different mount points, even if the same filesystem is mounted on both.)
自 Linux 3.11 以来,有一种方法可以创建新 文件而不将其链接到文件系统:open(2) has a new flag O_TMPFILE
:
O_TMPFILE
(since Linux 3.11)Create an unnamed temporary file. The pathname argument specifies a directory; an unnamed inode will be created in that directory's filesystem. Anything written to the resulting file will be lost when the last file descriptor is closed, unless the file is given a name.
O_TMPFILE
must be specified with one ofO_RDWR
orO_WRONLY
and, optionally,O_EXCL
. IfO_EXCL
is not specified, thenlinkat
(2) can be used to link the temporary file into the filesystem, making it permanent, using code like the following:char path[PATH_MAX];
fd = open("/path/to/dir", O_TMPFILE | O_RDWR,
S_IRUSR | S_IWUSR);
/* File I/O on 'fd'... */
snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd);
linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file",
AT_SYMLINK_FOLLOW);In this case, the
open()
mode argument determines the file permission mode, as withO_CREAT
.
手册告诉我们 O_TMPFILE
的两个常见用例之一是
Creating a file that is initially invisible, which is then populated with data and adjusted to have appropriate filesystem attributes (chown(2), chmod(2), fsetxattr(2), etc.) before being atomically linked into the filesystem in a fully formed state (using linkat(2) as described above).
这有很多缺点,除了它很新之外:文件系统还必须支持 O_TMPFILE
; ext[234] 支持它,3.15 中的 XFS 也支持; 3.16 中的 btrfs;此外,它可能仍然不适合您的情况,因为 linkat
需要 AT_SYMLINK_FOLLOW
而 renameat
不可用;如果目标名称已经存在,`linkat 不会替换目标。
关于不使用临时文件可以覆盖硬链接(hard link)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29180603/
我是 git 的新手,所以问题可能很简单,git reset --hard HEAD 和 git reset --hard 有什么区别? 最佳答案 HEAD 在您未指定该参数时是隐含的。 但是,您可以
为了恢复工作树和索引中的更改,此答案 ( https://stackoverflow.com/a/5812972/8278160) 建议运行以下命令: git reset --hard 运行它是否与运
这个问题在这里已经有了答案: What's the difference between HEAD^ and HEAD~ in Git? (17 个答案) 关闭 6 年前。 git reset --
我在 Stackoverflow/elsewhere 上尝试了很多链接来正确理解 的行为 git reset --hard option 我知道: 如果它被省略或者它是 origin,则在 origi
只是一个简短的问题。我想知道是否有一个选项或开关可以启用重新加载按钮下的“硬重新加载”和“清空缓存和硬重新加载”选项而无需打开devtools,以便它们始终弹出,即使devtools没有开放。 我知道
我最近在 Chrome 中发现了这个新功能: 我可以找出选项 1 和选项 3 之间的区别,选项 2 可能介于两者之间,但我在任何地方都找不到更精确的信息。 有人知道这 3 个选项的确切行为吗? 最佳答
我正在寻找一种很好的简单方法来查找哪些扇区占用给定文件。我的语言偏好是 C#。 从我的 A-Level Computing 类(class)中,我了解到硬盘驱动器在磁盘的前几 KB 上有一个查找表。在
我相信这是一个被分配的值并且这是无法改变的。一个例子是: int limit =5; for(int i =0 ; i
有些程序可以从硬盘恢复已删除的文件,也有一些程序会覆盖可用空间以防止已删除的文件被恢复。 覆盖可用空间的行为似乎是可以理解的。该程序创建文件并向其中写入任意字节。 但是,当谈到读取已删除的文件时,我感
Python 中有几种用于分割的包和方法。但是,如果我先验地知道某些像素(而不是其他像素)对应于特定对象,我如何使用它来分割其他对象? 哪些在 python 中实现的方法适用于这种方法? 谢谢。 最佳
我试图找到一个文件,然后在不同的目录中创建一个具有相同名称的硬链接(hard link)。但这不起作用,如果我使用 -exec 并在关闭后显示一个结果。我已经让它与 cp 一起工作,但我决定改用硬链接
我想知道是否可以在 Linux 上识别文件(或链接)是否是硬链接(hard link)。例如,如果我创建了: dd if=/dev/urandom bs=1024 count=10000 of=fil
在上次提交后,我的团队认为远程变得太繁重了,最好做一个新的来在 Assets 测试(重 repo )和功能测试(轻 repo )之间拆分任务。所以我做了一个 push --mirror 并创建了一个新
我不确定我是否遇到了默认超时(我可以在某处设置它吗?),但也许我错过了一些东西。当客户端的浏览器建立 websocket 连接时,我保持持久性。然后,在断开连接时,我删除该持久对象。足够简单。当客户端
我正在编写一个备份脚本,它使用硬链接(hard link)来不占用未修改文件的空间。 我想检查给定的文件系统(根据特定目录确定)是否在脚本的开始 支持硬链接(hard link) - 否则,它可能会中
我需要在运行时为路径长度超过 255 个字符的文件创建硬链接(hard link)(这是针对令人恼火的 Excel/Word 2011 限制的解决方法)。但由于稍后可能会再次打开同一个文件,如果我已经
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的作业要求我访问 test.txt 文档,因此文件名必须硬编码到我的 C 驱动器。我不知道硬编码是什么意思。有人可以帮我解决这个问题吗? 最佳答案 “硬编码”意味着将某些内容放入源代码中。如果您不进
我刚开始玩 Git,想知道一个具体案例: 我错误地做了一个沉重的提交,更糟糕的是我将它推送到远程服务器。 现在我正在尝试使用 git reset --hard v1.0 和 git push -f o
对于 Unix cp,您可以使用 --link 选项。当与文件夹一起使用时,它将 hard link涉及的文件而不是复制,示例 cp --recursive --link foo bar 这在某些情况
我是一名优秀的程序员,十分优秀!