我有一个文件夹,其中包含一定数量的具有硬链接的文件(在同一文件夹中或其他地方),我想取消这些文件的硬链接,因此它们变得独立,并且对其内容的更改不会影响任何其他文件(它们的链接数变为 1)。
下面,我给出了一个解决方案,它基本上将每个硬链接复制到另一个位置,然后将其移回原位。
然而,这种方法似乎相当粗糙且容易出错,所以我想知道是否有一些命令可以为我解除文件的硬链接。
粗略的回答:
查找具有硬链接的文件(编辑:要同时查找具有硬链接的套接字等,请使用find -not -type d -links +1
):
find -type f -links +1 # files only
find -not -type d -links +1 # files, sockets etc.
Run Code Online (Sandbox Code Playgroud)
解除文件硬链接的粗略方法(将其复制到另一个位置,然后将其移回):
编辑: 正如 Celada 所说,最好在下面执行 cp -p,以避免丢失时间戳和权限。 编辑: 创建一个临时目录并复制到其下的文件,而不是覆盖临时文件,它最大限度地降低了覆盖某些数据的风险,尽管该mv
命令仍然存在风险(感谢@Tobu)。 编辑: 尝试在同一文件系统(@MikkoRantalainen)中创建临时目录。
# This is unhardlink.sh
set -e
for i in "$@"; do
temp="$(mktemp -d -- "${i%/*}/hardlnk-XXXXXXXX")"
[ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp"
done
Run Code Online (Sandbox Code Playgroud)
因此,要取消硬链接所有硬链接(编辑:更改-type f
为-not -type d
,见上文):
find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
Run Code Online (Sandbox Code Playgroud)
您的脚本有改进的余地,例如向命令添加一个-p
选项,cp
以便在非硬链接操作中保留权限和时间戳,并且您可以添加一些错误处理,以便在出现错误时删除临时文件,但是您的解决方案的基本思想是唯一可行的。要取消硬链接文件,您必须复制它,然后将副本移回原始名称上。没有“不那么粗糙”的解决方案,并且该解决方案具有竞争条件,以防另一个进程同时访问该文件。
归档时间: |
|
查看次数: |
1751 次 |
最近记录: |