就地断开硬链接?

就地断开硬链接?

我将我的点文件置于版本控制之下,部署它们的脚本会创建硬链接。我也习惯etckeeper将我的版本/etc置于版本控制之下。最近我收到这样的警告:

warning: hard-linked files could cause problems with bzr

简单的复制 ( cp filename.ext filename.ext) 不起作用:

cp: `filename.ext' and `filename.ext' are the same file

重命名/移动文件(跨卷除外)也不会破坏硬链接。

所以我的问题是:有没有一种方法可以中断到文件的硬链接,而实际上不必知道该文件的其他硬链接在哪里?

答案1

cp -p filename filename.tmp
mv -f filename.tmp filename

使其可编写脚本:

dir=$(dirname -- "$filename")
tmp=$(TMPDIR=$dir mktemp)
cp -p -- "$filename" "$tmp"
mv -f -- "$tmp" "$filename"

首先进行复制,然后将其移动到位,其优点是文件自动从硬链接变为单独的副本(不存在filename部分或丢失的时间点)。

答案2

您可能的意思是您想要将硬链接拆分为一个单独的独立文件。

mv hardlink tempname && cp tempname hardlink && rm tempname

硬链接是目录中的条目与磁盘上的索引节点块之间的连接。

inode 存储文件元数据,对于小文件,某些文件系统将数据存储在 inode 中,否则存储指向数据块的指针,对于非常大的文件,则存储指向磁盘分配单元的间接和双间接指针列表。

无论如何,文件名(ls 命令生成的内容)和存储此元数据的 inode 块之间的连接称为硬链接。

对单个文件有多个硬链接意味着同一个 inode 被多个目录条目引用,可能位于不同的目录中(在单个文件系统上)

rm 从目录中删除文件名条目。一旦某个 inode 不再被任何文件引用,它的空间就会被释放以供其他文件使用。

答案3

将其放在 ~/.bashrc 文件的末尾。

delink () { tmpfile="$1$(date)"; cp -a "$1" "$tmpfile"; mv "$tmpfile" "$1"; }

像这样运行它

delink filename

答案4

一个空的就地 sed 可以解决这个问题(用 GNU sed 测试):

sed -i '' <file>

您可以在许多文件上使用findxargs运行它:

find <paths...> -type f -links +1 -print0 | xargs -0 sed -i ''

相关内容