硬链接和软链接(也称为符号链接或symlinks)是UNIX和类UNIX操作系统中文件系统的两种不同类型的链接。它们在文件系统中用于创建一个文件或目录的引用。主要区别:
硬链接
- 相同的inode:硬链接指向文件系统中的相同inode(数据结构)。这意味着硬链接与它所链接的原始文件完全相同,它们是文件系统中相同数据的不同名字。
- 不跨文件系统:硬链接不能跨越不同的文件系统,它们必须在同一个文件系统内。
- 不指向目录:在大多数系统中,你不能为目录创建硬链接,只能为文件创建。
- 删除行为:如果你删除了一个文件的硬链接,原始文件仍然存在,只要至少还有一个硬链接指向该文件。当最后一个硬链接被删除时,文件系统才会释放文件占用的空间。
- 引用计数:文件系统维护一个计数器来追踪有多少硬链接指向同一个inode。当这个计数为零时,文件数据才会被删除。
软链接(符号链接)
- 单独的inode:软链接有它自己的inode和文件属性。它是一个特殊类型的文件,其中包含了它所指向的目标文件或目录的路径。
- 可以跨文件系统:软链接可以跨文件系统指向另一个文件系统中的文件或目录。
- 可以指向目录:软链接可以指向文件也可以指向目录。
- 删除行为:如果你删除了软链接指向的原始文件,软链接仍然存在,但是变成了一个“死链接”或“悬挂链接”,因为它所指向的文件已经不存在了。
- 路径依赖:软链接通过路径名指向它们的目标。如果你移动了软链接指向的原始文件,软链接不会更新,会变成死链接。
创建命令
在Linux中创建硬链接和软链接的命令是ln
:
- 创建硬链接:
ln target link_name
- 创建软链接:
ln -s target link_name
在这里,target
是你想要链接的原始文件,link_name
是链接的名称。
使用场景
- 硬链接通常用于文件备份和防止意外删除。
- 软链接更多用于创建对程序、文件或目录的引用,它们更灵活,允许链接到目录,并且可以跨文件系统工作。
将一个文件夹之中的全部软连接转换为硬连接
#!/bin/bash
# 这个目录包含你的软链接
link_dir="raw"
# 这个目录是你想要创建硬链接的位置
hard_link_dir="./Hard"
# 确保硬链接目录存在
mkdir -p "$hard_link_dir"
# 遍历目录中的所有文件
for link in "$link_dir"/*; do
# 检查是否为软链接
if [ -L "$link" ]; then
# 获取软链接指向的原始文件
target=$(readlink "$link")
# 获取软链接的文件名
link_name=$(basename "$link")
# 创建硬链接的完整路径
new_hard_link_path="$hard_link_dir/$link_name"
# 创建硬链接,如果原始文件在同一文件系统中
if ln "$target" "$new_hard_link_path" 2>/dev/null; then
echo "硬链接已创建:$new_hard_link_path -> $target"
else
echo "硬链接创建失败:$link -> $target (可能是跨文件系统或其他错误)"
fi
fi
done