Linux连接符创建到指定目录
要将 /vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集
目录下的所有文件和子目录中的文件的符号链接全都创建到 /vol1/1000/Video/电视剧
目录中,可以使用 find
命令结合 ln -s
。下面是实现的方法:
步骤
- 打开终端。
- 执行以下命令:
find /vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集 -type f | while read file; do
destdir="/vol1/1000/Video/电视剧/$(dirname "${file#/vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集/}")"
mkdir -p "$destdir"
ln -s "$file" "$destdir/"
done
解释:
find /vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集 -type f
:查找指定目录下的所有文件(不包括目录)。while read file; do ...; done
:逐行读取找到的文件。destdir="/vol1/1000/Video/电视剧/$(dirname "${file#/vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集/}")"
:生成目标目录的路径,保持与源目录的相对结构。mkdir -p "$destdir"
:确保目标目录存在,如果不存在则创建它。ln -s "$file" "$destdir/"
:在目标目录中创建符号链接,指向源文件。
注意事项:
- 确保路径准确:确保
/vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集
目录存在,并且你有权限读取其中的文件和目录。 - 目标目录的权限:确认你可以在
/vol1/1000/Video/电视剧
目录中创建符号链接。 - 文件名冲突:如果目标目录中已存在同名文件,符号链接将无法创建。
执行以上命令后,所有源目录中的文件及其子目录中的文件的符号链接将被创建到目标目录中。
屏蔽指定后缀
find /vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集 -type f ! -name '*.jpg' ! -name '*.png' ! -name '*.nfo' | while read file; do
destdir="/vol1/1000/Video/电视剧/$(dirname "${file#/vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集/}")"
mkdir -p "$destdir"
ln -s "$file" "$destdir/"
done
已创建的连接符取消
查看指定目录文件
find /vol1/1000/Video/电视剧 -type l \( -name '*.jpg' -o -name '*.png' -o -name '*.nfo' \)find /vol1/1000/Video/电视剧 -type l \( -name '*.jpg' -o -name '*.png' -o -name '*.nfo' \)
清除命令
find /vol1/1000/Video/电视剧 -type l \( -name '*.jpg' -o -name '*.png' -o -name '*.nfo' \) -delete
创建执行脚本1.0
在清除符号链接时,同时也清除符号链接所指向的目标路径下的子目录中的符号链接。我们需要在 clear_symlinks
函数中进行修改,确保在删除符号链接的同时,也删除它们所指向的目标目录中的符号链接。
以下是更新后的脚本:
#!/bin/bash
# 函数:添加符号链接
add_symlinks() {
read -p "请输入源路径: " source_path
read -p "请输入屏蔽的文件后缀(例如 .jpg .png .nfo),按回车跳过: " -a extensions
exclude_conditions=()
for ext in "${extensions[@]}"; do
exclude_conditions+=( "! -name '*$ext'" )
done
read -p "请输入目标路径: " dest_path
find_command="find \"$source_path\" -type f"
for condition in "${exclude_conditions[@]}"; do
find_command+=" $condition"
done
eval "$find_command" | while read -r file; do
destdir="$dest_path/$(dirname "${file#$source_path/}")"
mkdir -p "$destdir"
ln -s "$file" "$destdir/"
done
echo "符号链接创建完成!"
}
# 函数:查看符号链接
view_symlinks() {
read -p "请输入要查看的目录: " view_path
read -p "输入后缀过滤(例如 .jpg .png .nfo),按回车查看全部: " -a view_extensions
if [ ${#view_extensions[@]} -eq 0 ]; then
find "$view_path" -type l
else
for ext in "${view_extensions[@]}"; do
find "$view_path" -type l -name "*$ext"
done
fi
}
# 函数:清除符号链接
clear_symlinks() {
read -p "请输入要清除的符号链接目录: " clear_path
read -p "输入后缀过滤(例如 .jpg .png .nfo),按回车清除全部: " -a clear_extensions
if [ ${#clear_extensions[@]} -eq 0 ]; then
# 找到并删除指定目录下的所有符号链接
find "$clear_path" -type l | while read -r symlink; do
target=$(readlink -f "$symlink") # 获取符号链接目标
dirname_target=$(dirname "$target") # 获取目标目录
# 删除目标目录下的符号链接
find "$dirname_target" -type l -delete
# 删除符号链接本身
rm "$symlink"
done
else
for ext in "${clear_extensions[@]}"; do
# 找到并删除指定目录下特定后缀的符号链接
find "$clear_path" -type l -name "*$ext" | while read -r symlink; do
target=$(readlink -f "$symlink") # 获取符号链接目标
dirname_target=$(dirname "$target") # 获取目标目录
# 删除目标目录下的符号链接
find "$dirname_target" -type l -delete
# 删除符号链接本身
rm "$symlink"
done
done
fi
echo "指定的符号链接及其目标目录下的相关符号链接已清除!"
}
# 菜单
while true; do
echo "请选择操作:"
echo "1. 添加符号链接"
echo "2. 查看指定目录符号链接"
echo "3. 清除指定符号链接"
echo "0. 退出"
read -p "输入选项: " choice
case $choice in
1) add_symlinks ;;
2) view_symlinks ;;
3) clear_symlinks ;;
0) echo "退出程序"; exit 0 ;;
*) echo "无效选项,请重试。" ;;
esac
done
解释
- 获取符号链接目标:使用
readlink -f "$symlink"
获取符号链接所指向的目标文件/目录。 - 删除目标目录下的符号链接:在删除符号链接之前,使用
find "$dirname_target" -type l -delete
递归删除目标目录下的所有符号链接。 - 删除符号链接本身:最后使用
rm "$symlink"
删除找到的符号链接。
保存和执行
- 保存脚本:将上面的代码复制到一个文件,例如
symlink_manager.sh
。 赋予执行权限:
chmod +x symlink_manager.sh
执行脚本:
./symlink_manager.sh
通过这个修改,您可以在清除符号链接时,确保目标目录下的所有相关符号链接也被删除。如果有其他问题或需求,请随时联系我!
添加清理空文件夹2.0
好的,下面是更新后的脚本,能够递归地删除目标目录下及其所有子目录中的空文件夹,确保只有在这些文件夹内完全没有文件时才会被删除。
#!/bin/bash
# 函数:添加符号链接
add_symlinks() {
read -p "请输入源路径: " source_path
read -p "请输入屏蔽的文件后缀(例如 .jpg .png .nfo),按回车跳过: " -a extensions
exclude_conditions=()
for ext in "${extensions[@]}"; do
exclude_conditions+=( "! -name '*$ext'" )
done
read -p "请输入目标路径: " dest_path
if [[ ! -d "$source_path" || ! -d "$dest_path" ]]; then
echo "源路径或目标路径不存在!"
return
fi
find_command="find \"$source_path\" -type f"
for condition in "${exclude_conditions[@]}"; do
find_command+=" $condition"
done
eval "$find_command" | while read -r file; do
destdir="$dest_path/$(dirname "${file#$source_path/}")"
mkdir -p "$destdir"
ln -s "$file" "$destdir/"
done
echo "符号链接创建完成!"
}
# 函数:查看符号链接
view_symlinks() {
read -p "请输入要查看的目录: " view_path
read -p "输入后缀过滤(例如 .jpg .png .nfo),按回车查看全部: " -a view_extensions
if [[ ! -d "$view_path" ]]; then
echo "指定目录不存在!"
return
fi
if [ ${#view_extensions[@]} -eq 0 ]; then
find "$view_path" -type l
else
for ext in "${view_extensions[@]}"; do
find "$view_path" -type l -name "*$ext"
done
fi
}
# 函数:清除符号链接
clear_symlinks() {
read -p "请输入要清除的符号链接目录: " clear_path
read -p "输入后缀过滤(例如 .jpg .png .nfo),按回车清除全部: " -a clear_extensions
if [[ ! -d "$clear_path" ]]; then
echo "指定目录不存在!"
return
fi
if [ ${#clear_extensions[@]} -eq 0 ]; then
find "$clear_path" -type l | while read -r symlink; do
rm "$symlink"
done
else
for ext in "${clear_extensions[@]}"; do
find "$clear_path" -type l -name "*$ext" | while read -r symlink; do
rm "$symlink"
done
done
fi
echo "指定的符号链接已清除!"
}
# 函数:清理空文件夹
clear_empty_dirs() {
read -p "请输入要清理的目录: " clear_path
if [[ ! -d "$clear_path" ]]; then
echo "指定目录不存在!"
return
fi
# 查找并删除所有空文件夹(包括子目录)
empty_dirs=$(find "$clear_path" -type d -empty)
if [[ -z "$empty_dirs" ]]; then
echo "没有找到空文件夹。"
return
fi
echo "以下是找到的空文件夹:"
echo "$empty_dirs"
# 删除找到的所有空文件夹
echo "$empty_dirs" | xargs -I {} rm -rf {}
echo "所有空文件夹已清理完成!"
}
# 菜单
while true; do
echo "请选择操作:"
echo "1. 添加符号链接"
echo "2. 查看指定目录符号链接"
echo "3. 清除指定符号链接"
echo "4. 清理指定目录下的空文件夹"
echo "0. 退出"
read -p "输入选项: " choice
case $choice in
1) add_symlinks ;;
2) view_symlinks ;;
3) clear_symlinks ;;
4) clear_empty_dirs ;;
0) echo "退出程序"; exit 0 ;;
*) echo "无效选项,请重试。" ;;
esac
done
更新功能解析
递归删除空文件夹:
- 在
clear_empty_dirs
函数中,使用find "$clear_path" -type d -empty
查找目标目录及其所有子目录下的空文件夹。 - 只要这些文件夹内完全没有文件,就会被删除。
- 在
使用方法
- 运行脚本后,选择
4
来清理指定目录下的空文件夹。 - 输入目标目录后,脚本将列出所有空文件夹并立即删除它们。
注意事项
- 一旦执行删除操作,所有空文件夹将被删除,无法恢复,请谨慎使用。确保目标目录内的空文件夹确实可以删除。
3.0升级补充连接符
对比源目录和目标目录中的文件,并补充在目标目录中缺失的符号链接。这个功能会检查源目录中的文件,如果在目标目录中,没有对应的符号链接,则会创建一个。
新增功能:补充链接符号
以下是更新后的脚本,增加了 补充缺失符号链接 的功能:
#!/bin/bash
# 函数:添加符号链接
add_symlinks() {
read -p "请输入源路径: " source_path
read -p "请输入屏蔽的文件后缀(例如 .jpg .png .nfo),按回车跳过: " -a extensions
exclude_conditions=()
for ext in "${extensions[@]}"; do
exclude_conditions+=( "! -name '*$ext'" )
done
read -p "请输入目标路径: " dest_path
if [[ ! -d "$source_path" || ! -d "$dest_path" ]]; then
echo "源路径或目标路径不存在!"
return
fi
find_command="find \"$source_path\" -type f"
for condition in "${exclude_conditions[@]}"; do
find_command+=" $condition"
done
eval "$find_command" | while read -r file; do
destdir="$dest_path/$(dirname "${file#$source_path/}")"
mkdir -p "$destdir"
symlink_name="$destdir/$(basename "$file")"
if [[ -e "$symlink_name" ]]; then
echo "警告: $symlink_name 已存在,跳过创建链接。"
else
ln -s "$file" "$symlink_name"
fi
done
echo "符号链接创建完成!"
}
# 函数:查看符号链接
view_symlinks() {
read -p "请输入要查看的目录: " view_path
read -p "输入后缀过滤(例如 .jpg .png .nfo),按回车查看全部: " -a view_extensions
if [[ ! -d "$view_path" ]]; then
echo "指定目录不存在!"
return
fi
if [ ${#view_extensions[@]} -eq 0 ]; then
find "$view_path" -type l
else
for ext in "${view_extensions[@]}"; do
find "$view_path" -type l -name "*$ext"
done
fi
}
# 函数:清除符号链接
clear_symlinks() {
read -p "请输入要清除的符号链接目录: " clear_path
read -p "输入后缀过滤(例如 .jpg .png .nfo),按回车清除全部: " -a clear_extensions
if [[ ! -d "$clear_path" ]]; then
echo "指定目录不存在!"
return
fi
if [ ${#clear_extensions[@]} -eq 0 ]; then
find "$clear_path" -type l -exec rm {} \;
else
for ext in "${clear_extensions[@]}"; do
find "$clear_path" -type l -name "*$ext" -exec rm {} \;
done
fi
echo "指定的符号链接已清除!"
}
# 函数:清理空文件夹
clear_empty_dirs() {
read -p "请输入要清理的目录: " clear_path
if [[ ! -d "$clear_path" ]]; then
echo "指定目录不存在!"
return
fi
empty_dirs=$(find "$clear_path" -type d -empty)
if [[ -z "$empty_dirs" ]]; then
echo "没有找到空文件夹。"
return
fi
echo "以下是找到的空文件夹:"
echo "$empty_dirs"
echo "$empty_dirs" | xargs -I {} rm -rf {}
echo "所有空文件夹已清理完成!"
}
# 函数:补充缺失的符号链接
supplement_symlinks() {
read -p "请输入源路径: " source_path
read -p "请输入目标路径: " dest_path
if [[ ! -d "$source_path" || ! -d "$dest_path" ]]; then
echo "源路径或目标路径不存在!"
return
fi
find "$source_path" -type f | while read -r file; do
destdir="$dest_path/$(dirname "${file#$source_path/}")"
mkdir -p "$destdir"
symlink_name="$destdir/$(basename "$file")"
if [[ ! -e "$symlink_name" ]]; then
ln -s "$file" "$symlink_name"
echo "已创建符号链接: $symlink_name"
else
echo "符号链接已存在: $symlink_name"
fi
done
echo "符号链接补充完成!"
}
# 菜单
while true; do
echo "请选择操作:"
echo "1. 添加符号链接"
echo "2. 查看指定目录符号链接"
echo "3. 清除指定符号链接"
echo "4. 清理指定目录下的空文件夹"
echo "5. 补充缺失的符号链接"
echo "0. 退出"
read -p "输入选项: " choice
case $choice in
1) add_symlinks ;;
2) view_symlinks ;;
3) clear_symlinks ;;
4) clear_empty_dirs ;;
5) supplement_symlinks ;;
0) echo "退出程序"; exit 0 ;;
*) echo "无效选项,请重试。" ;;
esac
done
新增的功能说明:
补充缺失的符号链接 (
supplement_symlinks
函数):- 用户输入源路径和目标路径。
- 脚本会遍历源路径中的每个文件,检查目标路径中对应的符号链接是否存在。
- 如果不存在,则创建符号链接;如果已存在,则输出相应的提示。
使用说明:
- 运行脚本。
- 选择菜单项 5 来补充符号链接。
- 输入源路径和目标路径,脚本会自动补充缺失的符号链接。
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »