/www/wwwroot/kls.red/usr/plugins/AMP/templates/MIPpage.php on line 33
">

Linux连接符创建到指定目录

2024-09-15T03:24:00

要将 /vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集 目录下的所有文件和子目录中的文件的符号链接全都创建到 /vol1/1000/Video/电视剧 目录中,可以使用 find 命令结合 ln -s。下面是实现的方法:

步骤

  1. 打开终端
  2. 执行以下命令
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/":在目标目录中创建符号链接,指向源文件。

注意事项:

  1. 确保路径准确:确保 /vol1/1000/Apps/clouddrive2/CloudNAS/115/剧集 目录存在,并且你有权限读取其中的文件和目录。
  2. 目标目录的权限:确认你可以在 /vol1/1000/Video/电视剧 目录中创建符号链接。
  3. 文件名冲突:如果目标目录中已存在同名文件,符号链接将无法创建。

执行以上命令后,所有源目录中的文件及其子目录中的文件的符号链接将被创建到目标目录中。

屏蔽指定后缀

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

解释

  1. 获取符号链接目标:使用 readlink -f "$symlink" 获取符号链接所指向的目标文件/目录。
  2. 删除目标目录下的符号链接:在删除符号链接之前,使用 find "$dirname_target" -type l -delete 递归删除目标目录下的所有符号链接。
  3. 删除符号链接本身:最后使用 rm "$symlink" 删除找到的符号链接。

保存和执行

  1. 保存脚本:将上面的代码复制到一个文件,例如 symlink_manager.sh
  2. 赋予执行权限

    chmod +x symlink_manager.sh
  3. 执行脚本

    ./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

更新功能解析

  1. 递归删除空文件夹

    • clear_empty_dirs 函数中,使用 find "$clear_path" -type d -empty 查找目标目录及其所有子目录下的空文件夹。
    • 只要这些文件夹内完全没有文件,就会被删除。

使用方法

  • 运行脚本后,选择 4 来清理指定目录下的空文件夹。
  • 输入目标目录后,脚本将列出所有空文件夹并立即删除它们。

注意事项

  • 一旦执行删除操作,所有空文件夹将被删除,无法恢复,请谨慎使用。确保目标目录内的空文件夹确实可以删除。
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »