场景需求分析
在开发环境迁移或版本迭代时,经常需要处理大型资源目录的复用问题。比如我们有个包含50亿图片的目录/foo/live/images
,现在要为开发版创建对应的/foo/dev/images
目录。
直接复制显然不现实:
# 绝对不可行的方案
cp -r /foo/live/images /foo/dev/images
Linux文件链接机制
Unix-like系统提供两种链接方式:
- 硬链接:直接指向inode,不能跨文件系统
- 软链接:类似Windows快捷方式,可以跨文件系统
具体实现方案
使用ln -s
创建符号链接是最佳选择:
# 先确保目标目录不存在
rm -rf /foo/dev/images 2>/dev/null
# 创建软链接
ln -s /foo/live/images /foo/dev/images
# 验证链接
ls -l /foo/dev | grep images
# 输出示例:images -> /foo/live/images
高级应用技巧
当需要批量处理时,可以结合find命令:
# 为多个子目录创建链接
find /foo/live -type d -name "images" | while read dir
do
dev_dir="${dir/live/dev}"
mkdir -p "$(dirname "$dev_dir")"
ln -s "$dir" "$dev_dir"
done
注意事项
- 删除软链接时要用
unlink
而非直接rm - 程序读取时需处理可能存在的循环链接
- 备份系统可能不会跟随软链接