我将我的点文件置于版本控制之下,部署它们的脚本会创建硬链接。我也习惯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>
您可以在许多文件上使用find
和xargs
运行它:
find <paths...> -type f -links +1 -print0 | xargs -0 sed -i ''