lndir 命令用于创建目录树的符号链接,它可以将一个目录的整个结构(包括子目录)复制到另一个位置,但使用符号链接而不是实际复制文件。这在需要保持目录结构但不想复制实际文件时非常有用。
lndir 是 X11 工具集的一部分,通常用于构建系统或需要多个目录视图的场景。
sudo apt update
sudo apt install xutils-dev
sudo yum install xorg-x11-utils
# 或者
sudo dnf install xorg-x11-utils
lndir [选项] 源目录 目标目录
lndir [选项] -silent 源目录 目标目录
注意:源目录和目标目录都必须是存在的目录。
| 选项 | 说明 |
|---|---|
| -silent | 静默模式,不显示输出信息 |
| -ignorelinks | 忽略源目录中的符号链接,不创建对应的链接 |
| -withrevinfo | 在创建的符号链接中包含版本控制信息 |
| -nocrossdev | 不跨设备边界创建链接(如果源和目标在不同设备上) |
| -help | 显示帮助信息 |
| -version | 显示版本信息 |
# 创建源目录结构
mkdir -p source/dir1 source/dir2
touch source/file1.txt source/file2.txt
touch source/dir1/subfile.txt
# 创建目标目录
mkdir target
# 使用lndir创建符号链接目录树
lndir source target
# 查看结果
ls -la target/
drwxr-xr-x 4 user user 4096 Oct 15 10:00 .
drwxr-xr-x 4 user user 4096 Oct 15 10:00 ..
lrwxrwxrwx 1 user user 14 Oct 15 10:00 dir1 -> ../source/dir1
lrwxrwxrwx 1 user user 14 Oct 15 10:00 dir2 -> ../source/dir2
lrwxrwxrwx 1 user user 17 Oct 15 10:00 file1.txt -> ../source/file1.txt
lrwxrwxrwx 1 user user 17 Oct 15 10:00 file2.txt -> ../source/file2.txt
# 静默模式,不显示输出
lndir -silent source target
# 验证结果
find target -type l | head -5
# 在源目录中创建一个符号链接
ln -s /etc/passwd source/link_to_passwd
# 使用ignorelinks选项,忽略符号链接
lndir -ignorelinks source target
# 检查目标目录
ls -la target/ | grep link_to_passwd
# 应该没有link_to_passwd这个链接
#!/bin/bash
# 典型的软件构建场景中使用lndir
# 创建构建目录结构
mkdir -p myproject/src
mkdir -p myproject/build
# 创建一些源代码文件
echo "int main() { return 0; }" > myproject/src/main.c
echo "#include " > myproject/src/header.h
# 进入构建目录
cd myproject/build
# 创建源代码的符号链接视图
lndir ../src .
# 查看构建目录内容
echo "构建目录内容:"
ls -la
# 编译代码(通过符号链接访问源文件)
echo "编译源代码:"
gcc -o program main.c
# 运行程序
./program
echo "程序退出状态: $?"
# 检查源和目标是否在不同设备上
df source target
# 如果不在同一设备,使用-nocrossdev避免跨设备链接
lndir -nocrossdev source target
# 如果希望跨设备,可以使用绝对路径
lndir $(realpath source) $(realpath target)
# 使用find和ln实现类似lndir的功能
# 但这不会创建目录结构,只链接文件
# 方法1:使用find和ln
find source -type f -exec ln -s {} target/ \;
# 方法2:使用cp创建符号链接
cp -rs source target
# lndir的优势:自动创建目录结构并链接所有文件
#!/bin/bash
# 如果目标目录已存在一些内容,可以这样清理并重新创建
SOURCE_DIR="source"
TARGET_DIR="target"
# 删除目标目录中的所有符号链接(保留真实文件)
find "$TARGET_DIR" -type l -delete
# 删除目标目录中的所有空目录
find "$TARGET_DIR" -type d -empty -delete
# 重新运行lndir
lndir "$SOURCE_DIR" "$TARGET_DIR"
echo "链接已恢复"
#!/bin/bash
# 批量创建多个目录的链接视图
BASE_SRC="/path/to/source"
BASE_DST="/path/to/target"
# 要链接的目录列表
DIRS=("docs" "src" "tests" "config")
for dir in "${DIRS[@]}"; do
if [ -d "$BASE_SRC/$dir" ]; then
echo "处理目录: $dir"
mkdir -p "$BASE_DST/$dir"
lndir -silent "$BASE_SRC/$dir" "$BASE_DST/$dir"
else
echo "跳过不存在的目录: $dir"
fi
done
echo "批量链接完成"
find "$BASE_DST" -type l | wc -l
echo "个符号链接已创建"
| 命令 | 功能 | 与lndir的区别 |
|---|---|---|
| ln -s | 创建单个符号链接 | lndir自动创建整个目录树的链接,包括所有子目录和文件 |
| cp -r | 递归复制目录 | cp复制实际文件内容,lndir只创建符号链接,节省空间 |
| cp -rs | 递归创建符号链接 | cp -rs在某些系统上可用,但lndir是专门为此设计的工具 |
| rsync -l | 同步时创建符号链接 | rsync功能更强大,但lndir更简单直接 |
| find + ln | 手动创建链接 | lndir自动处理目录结构,比手动组合命令更方便 |
在构建系统中,经常需要将源代码链接到构建目录,保持源代码不变,只在构建目录中进行编译。
# 典型的构建目录结构
project/
├── src/ # 源代码
├── build/ # 构建目录
│ └── src/ # 通过lndir创建的符号链接
└── Makefile
# 在Makefile中使用lndir
prepare:
mkdir -p build
cd build && lndir ../src .
为重要目录创建只读的符号链接视图,允许查看但不允许修改。
# 创建配置目录的只读视图
mkdir -p /var/readonly_view
lndir /etc /var/readonly_view
# 设置权限确保只读
chmod -R a-w /var/readonly_view
将多个来源的文档链接到Web服务器的文档根目录。
# 将多个目录的内容链接到web根目录
WEB_ROOT="/var/www/html"
SOURCE_DIRS=("/usr/share/doc" "/var/log" "/home/user/public_html")
mkdir -p "$WEB_ROOT"
for dir in "${SOURCE_DIRS[@]}"; do
if [ -d "$dir" ]; then
basename=$(basename "$dir")
lndir "$dir" "$WEB_ROOT/$basename"
fi
done
原因:系统未安装 lndir 命令。
解决方案:安装 xutils-dev 或 xorg-x11-utils 包:
# Ubuntu/Debian
sudo apt update
sudo apt install xutils-dev
# CentOS/RHEL
sudo yum install xorg-x11-utils
# Fedora
sudo dnf install xorg-x11-utils
原因:指定的源目录不存在。
解决方案:
ls -la 源目录路径mkdir -p 源目录路径原因:权限问题或路径问题。
解决方案:
ls -l 目标目录/文件名
readlink 目标目录/文件名
ls -l 源文件