我有一个文件夹,其中包含一定数量的硬链接的文件(在同一个文件夹或其他地方),我想要硬链接这些文件,所以它们成为独立的,并改变其内容不会影响任何其他文件(链接数量为1)。
下面,我给出一个解决scheme,基本上复制每个硬链接到另一个位置,然后将其移回原位。
然而这种方法似乎是相当粗糙和容易出错的,所以我想知道是否有一些命令可以为我解除一个文件的连接。
原始答案:
查找具有硬链接的文件( 编辑 :也可以find具有硬链接的套接字等,使用find -not -type d -links +1 -not find -not -type d -links +1 ):
find -type f -links +1
一个简单的方法去硬链接文件(复制到另一个位置,并将其移回): 编辑: 正如Celada所说,最好做一个cp -p下面,以避免失去时间戳和权限。 编辑: 创build一个临时目录并复制到它下面的一个文件,而不是覆盖临时文件,尽pipemv命令仍然有风险(谢谢@Tobu),它将覆盖一些数据的风险降至最低。
# This is unhardlink.sh set -e for i in "$@"; do temp="$(mktemp -d ./hardlnk-XXXXXXXX)" [ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp" done
因此,要解除所有硬链接的链接( 编辑 :更改-type f到-not -type d ,请参阅上文):
find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
在脚本中还有改进的空间,例如在cp命令中添加-p选项,以便在unhardlink操作中保留权限和时间戳,并且可以添加一些error handling,以便临时文件在一个错误,但你的解决scheme的基本思想是唯一的工作。 要将文件取消硬连接,您必须将其复制,然后将副本移回原始名称。 没有“不太原油”的解决scheme,这种解决scheme有竞争条件,以防另一个进程同时访问文件。
如果你想消耗磁盘空间,而且你有一个比较现代化的tar版本(例如Ubuntu 10.04和CentOS 6上的版本),你可以使用--hard-dereference选项。
就像是:
$ cd /path/to/directory $ ls -l * bar: total 12 -rw-rw-r-- 2 cjc cjc 2 May 6 19:07 1 -rw-rw-r-- 2 cjc cjc 2 May 6 19:07 2 -rw-rw-r-- 1 cjc cjc 2 May 6 19:07 3 foo: total 12 -rw-rw-r-- 2 cjc cjc 3 May 6 19:07 1 -rw-rw-r-- 2 cjc cjc 2 May 6 19:07 2 -rw-rw-r-- 1 cjc cjc 2 May 6 19:07 4
(我在哪里运行ln foo/[12] bar )
$ tar cvf /tmp/dereferencing.tar --hard-dereference . $ tar xvf /tmp/dereferencing.tar $ ls -l * bar: total 12 -rw-rw-r-- 1 cjc cjc 2 May 6 19:07 1 -rw-rw-r-- 1 cjc cjc 2 May 6 19:07 2 -rw-rw-r-- 1 cjc cjc 2 May 6 19:07 3 foo: total 12 -rw-rw-r-- 1 cjc cjc 3 May 6 19:07 1 -rw-rw-r-- 1 cjc cjc 2 May 6 19:07 2 -rw-rw-r-- 1 cjc cjc 2 May 6 19:07 4
从手册页:
--hard-dereference follow hard links; archive and dump the files they refer to