首页
友情链接
关于我们
Search
1
Docker安装Chromium浏览器 - Docker里的浏览器
388 阅读
2
Windows10添加共享网络打印机出现错误0x000004f8
264 阅读
3
CPU型号后缀带K、KF、F、KS、X、G、H、U、P的含义与区别
227 阅读
4
Docker安装FRPS、FRPC
189 阅读
5
Docker安装网心云
151 阅读
系统
Windows
Linux
Docker
编程
源码
代码
软件
电脑软件
手机软件
登录
Search
Kernel
累计撰写
100
篇文章
累计收到
0
条评论
本站共
43.14 W
字
首页
栏目
系统
Windows
Linux
Docker
编程
源码
代码
软件
电脑软件
手机软件
页面
友情链接
关于我们
用户中心
登录
搜索到
28
篇与
Linux
相关的结果
2025-04-28
Linux挂载FTP、WEBDAV、SMB为本地目录交互式脚本
使用方法1.代码保存为multi_mount_manager.sh2.切换成root用户执行sudo -i3.运行bash multi_mount_manager.sh#!/bin/bash # multi_mount_manager.sh - 多协议挂载管理工具(支持远端目录) # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # 配置文件 CONFIG_DIR="$HOME/.mount_manager" FTP_CONFIG="$CONFIG_DIR/ftp_config" WEBDAV_CONFIG="$CONFIG_DIR/webdav_config" SMB_CONFIG="$CONFIG_DIR/smb_config" MOUNT_HISTORY="$CONFIG_DIR/mount_history" # 默认挂载点 DEFAULT_MOUNT_BASE="$HOME/mnt" # 加载配置 load_config() { mkdir -p "$CONFIG_DIR" # 加载FTP配置 if [ -f "$FTP_CONFIG" ]; then source "$FTP_CONFIG" else FTP_HOST="" FTP_USER="" FTP_PASS="" FTP_PORT="21" FTP_REMOTE_PATH="/" FTP_MOUNT_POINT="$DEFAULT_MOUNT_BASE/ftp" fi # 加载WebDAV配置 if [ -f "$WEBDAV_CONFIG" ]; then source "$WEBDAV_CONFIG" else WEBDAV_URL="" WEBDAV_USER="" WEBDAV_PASS="" WEBDAV_REMOTE_PATH="/" WEBDAV_MOUNT_POINT="$DEFAULT_MOUNT_BASE/webdav" fi # 加载SMB配置 if [ -f "$SMB_CONFIG" ]; then source "$SMB_CONFIG" else SMB_SERVER="" SMB_SHARE="" SMB_USER="" SMB_PASS="" SMB_DOMAIN="WORKGROUP" SMB_REMOTE_PATH="/" SMB_MOUNT_POINT="$DEFAULT_MOUNT_BASE/smb" fi } # 保存配置 save_config() { # 保存FTP配置 cat > "$FTP_CONFIG" << EOF FTP_HOST="$FTP_HOST" FTP_USER="$FTP_USER" FTP_PASS="$FTP_PASS" FTP_PORT="$FTP_PORT" FTP_REMOTE_PATH="$FTP_REMOTE_PATH" FTP_MOUNT_POINT="$FTP_MOUNT_POINT" EOF # 保存WebDAV配置 cat > "$WEBDAV_CONFIG" << EOF WEBDAV_URL="$WEBDAV_URL" WEBDAV_USER="$WEBDAV_USER" WEBDAV_PASS="$WEBDAV_PASS" WEBDAV_REMOTE_PATH="$WEBDAV_REMOTE_PATH" WEBDAV_MOUNT_POINT="$WEBDAV_MOUNT_POINT" EOF # 保存SMB配置 cat > "$SMB_CONFIG" << EOF SMB_SERVER="$SMB_SERVER" SMB_SHARE="$SMB_SHARE" SMB_USER="$SMB_USER" SMB_PASS="$SMB_PASS" SMB_DOMAIN="$SMB_DOMAIN" SMB_REMOTE_PATH="$SMB_REMOTE_PATH" SMB_MOUNT_POINT="$SMB_MOUNT_POINT" EOF chmod 600 "$CONFIG_DIR"/* echo -e "${GREEN}配置已保存${NC}" } # 解析URL为各个组件 parse_url() { local url="$1" local protocol="$2" case $protocol in ftp) # ftp://user:pass@host:port/path FTP_HOST=$(echo "$url" | sed 's|^ftp://||' | cut -d/ -f1 | cut -d@ -f2) FTP_USER=$(echo "$url" | sed 's|^ftp://||' | cut -d/ -f1 | cut -d@ -f1 | cut -d: -f1) FTP_PASS=$(echo "$url" | sed 's|^ftp://||' | cut -d/ -f1 | cut -d@ -f1 | cut -d: -f2) FTP_REMOTE_PATH=$(echo "$url" | sed 's|^ftp://[^/]*||') [ -z "$FTP_REMOTE_PATH" ] && FTP_REMOTE_PATH="/" ;; webdav) # http://user:pass@host/path WEBDAV_URL=$(echo "$url" | cut -d' ' -f1) WEBDAV_REMOTE_PATH=$(echo "$url" | cut -d' ' -f2) [ -z "$WEBDAV_REMOTE_PATH" ] && WEBDAV_REMOTE_PATH="/" ;; smb) # //server/share/path SMB_SERVER=$(echo "$url" | sed 's|^//||' | cut -d/ -f1) SMB_SHARE=$(echo "$url" | sed 's|^//[^/]*/||' | cut -d/ -f1) SMB_REMOTE_PATH=$(echo "$url" | sed "s|^//$SMB_SERVER/$SMB_SHARE||") [ -z "$SMB_REMOTE_PATH" ] && SMB_REMOTE_PATH="/" ;; esac } # 显示远端目录选择器 remote_path_selector() { local protocol="$1" local current_path="$2" echo -e "${CYAN}=== 远端目录浏览器 ($protocol) ===${NC}" echo -e "当前路径: ${YELLOW}$current_path${NC}" echo case $protocol in ftp) list_ftp_directory "$current_path" ;; webdav) list_webdav_directory "$current_path" ;; smb) list_smb_directory "$current_path" ;; esac echo echo -e "${GREEN}[操作选项]${NC}" echo "1. 进入子目录" echo "2. 返回上级目录" echo "3. 使用当前目录" echo "4. 手动输入路径" echo "0. 取消" echo read -p "请选择: " choice case $choice in 1) read -p "输入子目录名: " subdir new_path="${current_path%/}/$subdir" remote_path_selector "$protocol" "$new_path" ;; 2) parent_path=$(dirname "$current_path") [ "$parent_path" = "." ] && parent_path="/" remote_path_selector "$protocol" "$parent_path" ;; 3) echo "$current_path" ;; 4) read -p "输入完整路径: " manual_path echo "$manual_path" ;; 0) echo "$current_path" ;; *) echo "$current_path" ;; esac } # 列出FTP目录内容 list_ftp_directory() { local path="$1" echo -e "${BLUE}目录内容:${NC}" if [ -z "$FTP_PASS" ]; then # 匿名访问 curl -s --list-only "ftp://$FTP_HOST:$FTP_PORT$path" 2>/dev/null | head -20 else # 认证访问 curl -s --list-only --user "$FTP_USER:$FTP_PASS" "ftp://$FTP_HOST:$FTP_PORT$path" 2>/dev/null | head -20 fi } # 列出WebDAV目录内容 list_webdav_directory() { local path="$1" local full_url="$WEBDAV_URL$path" echo -e "${BLUE}目录内容:${NC}" if [ -z "$WEBDAV_PASS" ]; then # 匿名访问 curl -s -X PROPFIND "$full_url" -H "Depth: 1" 2>/dev/null | \ grep -o '[^<]*' | \ sed 's###g; s###g' | \ head -20 else # 认证访问 curl -s -X PROPFIND "$full_url" -H "Depth: 1" --user "$WEBDAV_USER:$WEBDAV_PASS" 2>/dev/null | \ grep -o '[^<]*' | \ sed 's###g; s###g' | \ head -20 fi } # 列出SMB目录内容 list_smb_directory() { local path="$1" local share_url="//$SMB_SERVER/$SMB_SHARE$path" echo -e "${BLUE}目录内容:${NC}" if command -v smbclient &> /dev/null; then if [ -z "$SMB_PASS" ]; then # 访客访问 smbclient "//$SMB_SERVER/$SMB_SHARE" -N -c "cd \"$path\"; dir" 2>/dev/null | \ grep '^ ' | awk '{print $1}' | head -20 else # 认证访问 smbclient "//$SMB_SERVER/$SMB_SHARE" -U "$SMB_USER%$SMB_PASS" -W "$SMB_DOMAIN" -c "cd \"$path\"; dir" 2>/dev/null | \ grep '^ ' | awk '{print $1}' | head -20 fi else echo -e "${YELLOW}需要安装smbclient来浏览目录${NC}" fi } # 记录挂载历史 record_mount() { local protocol="$1" local server="$2" local remote_path="$3" local mount_point="$4" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "$timestamp|$protocol|$server|$remote_path|$mount_point" >> "$MOUNT_HISTORY" } # 检查依赖 check_dependencies() { local missing_pkgs="" # 检查FTP依赖 if ! command -v curlftpfs &> /dev/null; then missing_pkgs+=" curlftpfs" fi # 检查WebDAV依赖 if ! command -v mount.davfs &> /dev/null; then missing_pkgs+=" davfs2" fi # 检查SMB依赖 if ! command -v mount.cifs &> /dev/null; then missing_pkgs+=" cifs-utils" fi # 检查curl(用于目录浏览) if ! command -v curl &> /dev/null; then missing_pkgs+=" curl" fi if [ -n "$missing_pkgs" ]; then echo -e "${YELLOW}缺少必要软件包:$missing_pkgs${NC}" echo -e "${BLUE}是否安装?(y/N): ${NC}" read -n 1 install_choice echo if [[ "$install_choice" =~ ^[Yy]$ ]]; then install_dependencies "$missing_pkgs" else echo -e "${RED}部分功能可能无法使用${NC}" fi fi } # 安装依赖 install_dependencies() { local pkgs="$1" echo -e "${BLUE}正在安装依赖包...${NC}" if [ -f /etc/debian_version ]; then sudo apt update sudo apt install -y $pkgs elif [ -f /etc/redhat-release ]; then sudo yum install -y $pkgs elif [ -f /etc/arch-release ]; then sudo pacman -S --noconfirm $pkgs elif [ -f /etc/fedora-release ]; then sudo dnf install -y $pkgs else echo -e "${RED}无法识别发行版,请手动安装: $pkgs${NC}" return 1 fi if [ $? -eq 0 ]; then echo -e "${GREEN}依赖安装完成${NC}" else echo -e "${RED}依赖安装失败${NC}" fi } # 显示协议选择菜单 show_protocol_menu() { clear echo -e "${BLUE}══════════════════════════════════════════════════${NC}" echo -e "${BLUE} 多协议挂载管理工具 v2.1 (支持远端目录)${NC}" echo -e "${BLUE}══════════════════════════════════════════════════${NC}" echo echo -e "${CYAN}[选择协议]${NC}" echo -e " 1. ${GREEN}FTP${NC} - 文件传输协议" echo -e " 2. ${YELLOW}WebDAV${NC} - Web分布式创作和版本控制" echo -e " 3. ${PURPLE}SMB/CIFS${NC} - Windows文件共享" echo -e " 4. ${BLUE}查看所有挂载${NC}" echo -e " 5. ${CYAN}批量卸载所有${NC}" echo -e " 6. ${RED}清理挂载点${NC}" echo -e " 7. ${GREEN}快速URL导入${NC}" echo -e " 0. 返回主菜单" echo echo -e "${BLUE}══════════════════════════════════════════════════${NC}" } # 显示主菜单 show_main_menu() { clear echo -e "${BLUE}══════════════════════════════════════════════════${NC}" echo -e "${BLUE} 多协议挂载管理工具 v2.1 (支持远端目录)${NC}" echo -e "${BLUE}══════════════════════════════════════════════════${NC}" echo # 显示当前挂载状态 echo -e "${YELLOW}[当前挂载状态]${NC}" show_mount_status brief echo echo -e "${GREEN}[主菜单选项]${NC}" echo -e " 1. 选择协议进行挂载" echo -e " 2. 配置连接信息" echo -e " 3. 测试连接" echo -e " 4. 查看挂载历史" echo -e " 5. 设置开机自动挂载" echo -e " 6. 创建快捷命令" echo -e " 7. 浏览远程目录" echo -e " 0. 退出" echo echo -e "${BLUE}══════════════════════════════════════════════════${NC}" } # 显示挂载状态 show_mount_status() { local mode="$1" if [ "$mode" = "brief" ]; then # 简要显示 local mounted_count=0 # 检查FTP if mount | grep -q "$FTP_MOUNT_POINT"; then echo -e " ${GREEN}✓${NC} FTP: $FTP_HOST$FTP_REMOTE_PATH → $FTP_MOUNT_POINT" mounted_count=$((mounted_count + 1)) fi # 检查WebDAV if mount | grep -q "$WEBDAV_MOUNT_POINT"; then echo -e " ${GREEN}✓${NC} WebDAV: $WEBDAV_REMOTE_PATH → $WEBDAV_MOUNT_POINT" mounted_count=$((mounted_count + 1)) fi # 检查SMB if mount | grep -q "$SMB_MOUNT_POINT"; then echo -e " ${GREEN}✓${NC} SMB: //$SMB_SERVER/$SMB_SHARE$SMB_REMOTE_PATH → $SMB_MOUNT_POINT" mounted_count=$((mounted_count + 1)) fi if [ $mounted_count -eq 0 ]; then echo -e " ${YELLOW}没有挂载的远程文件系统${NC}" fi else # 详细显示 echo -e "${CYAN}[详细挂载信息]${NC}" echo # FTP状态 echo -e "${GREEN}FTP状态:${NC}" if mount | grep -q "$FTP_MOUNT_POINT"; then mount | grep "$FTP_MOUNT_POINT" echo -e " 远端路径: $FTP_REMOTE_PATH" echo -e " 目录内容:" ls -la "$FTP_MOUNT_POINT/" 2>/dev/null | head -5 else echo -e " ${YELLOW}未挂载${NC}" echo -e " 配置: $FTP_HOST:$FTP_PORT$FTP_REMOTE_PATH" fi echo # WebDAV状态 echo -e "${YELLOW}WebDAV状态:${NC}" if mount | grep -q "$WEBDAV_MOUNT_POINT"; then mount | grep "$WEBDAV_MOUNT_POINT" echo -e " 远端路径: $WEBDAV_REMOTE_PATH" echo -e " 目录内容:" ls -la "$WEBDAV_MOUNT_POINT/" 2>/dev/null | head -5 else echo -e " ${YELLOW}未挂载${NC}" echo -e " 配置: $WEBDAV_URL$WEBDAV_REMOTE_PATH" fi echo # SMB状态 echo -e "${PURPLE}SMB状态:${NC}" if mount | grep -q "$SMB_MOUNT_POINT"; then mount | grep "$SMB_MOUNT_POINT" echo -e " 远端路径: $SMB_REMOTE_PATH" echo -e " 目录内容:" ls -la "$SMB_MOUNT_POINT/" 2>/dev/null | head -5 else echo -e " ${YELLOW}未挂载${NC}" echo -e " 配置: //$SMB_SERVER/$SMB_SHARE$SMB_REMOTE_PATH" fi fi } # FTP相关功能 configure_ftp() { echo -e "${GREEN}=== 配置FTP连接 ===${NC}" read -p "FTP服务器地址 [当前: $FTP_HOST]: " input [ -n "$input" ] && FTP_HOST="$input" read -p "端口 [当前: $FTP_PORT]: " input [ -n "$input" ] && FTP_PORT="$input" read -p "用户名 [当前: $FTP_USER]: " input [ -n "$input" ] && FTP_USER="$input" read -s -p "密码 [输入新密码或回车保持]: " input echo [ -n "$input" ] && FTP_PASS="$input" echo -e "${YELLOW}当前远端路径: $FTP_REMOTE_PATH${NC}" read -p "远端路径 [输入路径或回车保持,输入'browse'浏览]: " input if [ "$input" = "browse" ]; then if [ -n "$FTP_HOST" ]; then FTP_REMOTE_PATH=$(remote_path_selector "ftp" "$FTP_REMOTE_PATH") else echo -e "${RED}请先设置服务器地址${NC}" fi elif [ -n "$input" ]; then FTP_REMOTE_PATH="$input" fi read -p "本地挂载点目录 [当前: $FTP_MOUNT_POINT]: " input [ -n "$input" ] && FTP_MOUNT_POINT="$input" # 创建挂载点目录 mkdir -p "$FTP_MOUNT_POINT" save_config } mount_ftp() { echo -e "${GREEN}[挂载FTP]${NC}" if [ -z "$FTP_HOST" ]; then echo -e "${YELLOW}请先配置FTP连接信息${NC}" configure_ftp fi # 检查是否已挂载 if mount | grep -q "$FTP_MOUNT_POINT"; then echo -e "${YELLOW}FTP已经挂载到 $FTP_MOUNT_POINT${NC}" read -p "是否重新挂载?(y/N): " choice if [[ ! "$choice" =~ ^[Yy]$ ]]; then return fi umount_ftp fi # 创建挂载点 mkdir -p "$FTP_MOUNT_POINT" echo -e "${BLUE}正在挂载FTP...${NC}" echo -e "服务器: ${FTP_HOST}:${FTP_PORT}" echo -e "远端路径: $FTP_REMOTE_PATH" echo -e "挂载点: $FTP_MOUNT_POINT" local mount_cmd local full_url if [ -z "$FTP_PASS" ]; then # 匿名访问 full_url="ftp://$FTP_HOST:$FTP_PORT$FTP_REMOTE_PATH" mount_cmd="curlftpfs -o allow_other,uid=$(id -u),gid=$(id -g) \"$full_url\" \"$FTP_MOUNT_POINT\"" else # 认证访问 full_url="ftp://$FTP_USER:$FTP_PASS@$FTP_HOST:$FTP_PORT$FTP_REMOTE_PATH" mount_cmd="curlftpfs -o allow_other,uid=$(id -u),gid=$(id -g) \"$full_url\" \"$FTP_MOUNT_POINT\"" fi echo -e "${YELLOW}执行命令: $mount_cmd${NC}" if eval "$mount_cmd"; then echo -e "${GREEN}✓ FTP挂载成功${NC}" record_mount "FTP" "$FTP_HOST:$FTP_PORT" "$FTP_REMOTE_PATH" "$FTP_MOUNT_POINT" else echo -e "${RED}✗ FTP挂载失败${NC}" echo -e "${YELLOW}提示: 尝试不使用远端路径挂载根目录${NC}" read -p "是否尝试挂载根目录?(y/N): " retry if [[ "$retry" =~ ^[Yy]$ ]]; then FTP_REMOTE_PATH="/" save_config mount_ftp fi fi } umount_ftp() { if mount | grep -q "$FTP_MOUNT_POINT"; then echo -e "${BLUE}正在卸载FTP...${NC}" fusermount -u "$FTP_MOUNT_POINT" 2>/dev/null || sudo fusermount -u "$FTP_MOUNT_POINT" echo -e "${GREEN}✓ FTP卸载完成${NC}" fi } test_ftp() { if [ -z "$FTP_HOST" ]; then echo -e "${RED}请先配置FTP连接信息${NC}" return fi echo -e "${BLUE}测试FTP连接...${NC}" echo -e "测试路径: $FTP_REMOTE_PATH" if [ -z "$FTP_PASS" ]; then timeout 10 curl -s --list-only "ftp://$FTP_HOST:$FTP_PORT$FTP_REMOTE_PATH" > /dev/null 2>&1 else timeout 10 curl -s --list-only --user "$FTP_USER:$FTP_PASS" "ftp://$FTP_HOST:$FTP_PORT$FTP_REMOTE_PATH" > /dev/null 2>&1 fi if [ $? -eq 0 ]; then echo -e "${GREEN}✓ FTP连接测试成功${NC}" else echo -e "${RED}✗ FTP连接测试失败${NC}" echo -e "${YELLOW}尝试测试根目录...${NC}" if [ -z "$FTP_PASS" ]; then timeout 10 curl -s --list-only "ftp://$FTP_HOST:$FTP_PORT/" > /dev/null 2>&1 else timeout 10 curl -s --list-only --user "$FTP_USER:$FTP_PASS" "ftp://$FTP_HOST:$FTP_PORT/" > /dev/null 2>&1 fi if [ $? -eq 0 ]; then echo -e "${YELLOW}根目录可访问,但指定路径不可用${NC}" fi fi } # WebDAV相关功能 configure_webdav() { echo -e "${YELLOW}=== 配置WebDAV连接 ===${NC}" read -p "WebDAV基础URL (如: http://example.com) [当前: $WEBDAV_URL]: " input [ -n "$input" ] && WEBDAV_URL="$input" read -p "用户名 [当前: $WEBDAV_USER]: " input [ -n "$input" ] && WEBDAV_USER="$input" read -s -p "密码 [输入新密码或回车保持]: " input echo [ -n "$input" ] && WEBDAV_PASS="$input" echo -e "${YELLOW}当前远端路径: $WEBDAV_REMOTE_PATH${NC}" read -p "远端路径 [输入路径或回车保持,输入'browse'浏览]: " input if [ "$input" = "browse" ]; then if [ -n "$WEBDAV_URL" ]; then WEBDAV_REMOTE_PATH=$(remote_path_selector "webdav" "$WEBDAV_REMOTE_PATH") else echo -e "${RED}请先设置基础URL${NC}" fi elif [ -n "$input" ]; then WEBDAV_REMOTE_PATH="$input" fi read -p "本地挂载点目录 [当前: $WEBDAV_MOUNT_POINT]: " input [ -n "$input" ] && WEBDAV_MOUNT_POINT="$input" # 创建挂载点目录 mkdir -p "$WEBDAV_MOUNT_POINT" save_config } mount_webdav() { echo -e "${YELLOW}[挂载WebDAV]${NC}" if [ -z "$WEBDAV_URL" ]; then echo -e "${YELLOW}请先配置WebDAV连接信息${NC}" configure_webdav fi # 检查是否已挂载 if mount | grep -q "$WEBDAV_MOUNT_POINT"; then echo -e "${YELLOW}WebDAV已经挂载到 $WEBDAV_MOUNT_POINT${NC}" read -p "是否重新挂载?(y/N): " choice if [[ ! "$choice" =~ ^[Yy]$ ]]; then return fi umount_webdav fi # 创建挂载点 mkdir -p "$WEBDAV_MOUNT_POINT" local full_url="${WEBDAV_URL%/}${WEBDAV_REMOTE_PATH}" echo -e "${BLUE}正在挂载WebDAV...${NC}" echo -e "URL: $full_url" echo -e "挂载点: $WEBDAV_MOUNT_POINT" local mount_cmd if [ -z "$WEBDAV_PASS" ]; then # 匿名访问 mount_cmd="sudo mount -t davfs \"$full_url\" \"$WEBDAV_MOUNT_POINT\" -o uid=$(id -u),gid=$(id -g),noexec" else # 认证访问 mount_cmd="sudo mount -t davfs \"$full_url\" \"$WEBDAV_MOUNT_POINT\" -o uid=$(id -u),gid=$(id -g),noexec,username=$WEBDAV_USER,password=$WEBDAV_PASS" fi echo -e "${YELLOW}执行命令: $mount_cmd${NC}" if eval "$mount_cmd"; then echo -e "${GREEN}✓ WebDAV挂载成功${NC}" record_mount "WebDAV" "$WEBDAV_URL" "$WEBDAV_REMOTE_PATH" "$WEBDAV_MOUNT_POINT" else echo -e "${RED}✗ WebDAV挂载失败${NC}" echo -e "${YELLOW}提示: 可能需要将用户加入davfs2组: sudo usermod -aG davfs2 $USER${NC}" fi } umount_webdav() { if mount | grep -q "$WEBDAV_MOUNT_POINT"; then echo -e "${BLUE}正在卸载WebDAV...${NC}" sudo umount "$WEBDAV_MOUNT_POINT" echo -e "${GREEN}✓ WebDAV卸载完成${NC}" fi } test_webdav() { if [ -z "$WEBDAV_URL" ]; then echo -e "${RED}请先配置WebDAV连接信息${NC}" return fi local full_url="${WEBDAV_URL%/}${WEBDAV_REMOTE_PATH}" echo -e "${BLUE}测试WebDAV连接...${NC}" echo -e "测试URL: $full_url" if [ -z "$WEBDAV_PASS" ]; then timeout 10 curl -s -I "$full_url" | head -1 | grep -q "200" else timeout 10 curl -s -I --user "$WEBDAV_USER:$WEBDAV_PASS" "$full_url" | head -1 | grep -q "200" fi if [ $? -eq 0 ]; then echo -e "${GREEN}✓ WebDAV连接测试成功${NC}" else echo -e "${RED}✗ WebDAV连接测试失败${NC}" fi } # SMB相关功能 configure_smb() { echo -e "${PURPLE}=== 配置SMB/CIFS连接 ===${NC}" read -p "SMB服务器地址 [当前: $SMB_SERVER]: " input [ -n "$input" ] && SMB_SERVER="$input" read -p "共享名称 [当前: $SMB_SHARE]: " input [ -n "$input" ] && SMB_SHARE="$input" read -p "域名 [当前: $SMB_DOMAIN]: " input [ -n "$input" ] && SMB_DOMAIN="$input" read -p "用户名 [当前: $SMB_USER]: " input [ -n "$input" ] && SMB_USER="$input" read -s -p "密码 [输入新密码或回车保持]: " input echo [ -n "$input" ] && SMB_PASS="$input" echo -e "${YELLOW}当前远端路径: $SMB_REMOTE_PATH${NC}" read -p "远端路径 [输入路径或回车保持,输入'browse'浏览]: " input if [ "$input" = "browse" ]; then if [ -n "$SMB_SERVER" ] && [ -n "$SMB_SHARE" ]; then SMB_REMOTE_PATH=$(remote_path_selector "smb" "$SMB_REMOTE_PATH") else echo -e "${RED}请先设置服务器地址和共享名称${NC}" fi elif [ -n "$input" ]; then SMB_REMOTE_PATH="$input" fi read -p "本地挂载点目录 [当前: $SMB_MOUNT_POINT]: " input [ -n "$input" ] && SMB_MOUNT_POINT="$input" # 创建挂载点目录 mkdir -p "$SMB_MOUNT_POINT" save_config } mount_smb() { echo -e "${PURPLE}[挂载SMB/CIFS]${NC}" if [ -z "$SMB_SERVER" ] || [ -z "$SMB_SHARE" ]; then echo -e "${YELLOW}请先配置SMB连接信息${NC}" configure_smb fi # 检查是否已挂载 if mount | grep -q "$SMB_MOUNT_POINT"; then echo -e "${YELLOW}SMB已经挂载到 $SMB_MOUNT_POINT${NC}" read -p "是否重新挂载?(y/N): " choice if [[ ! "$choice" =~ ^[Yy]$ ]]; then return fi umount_smb fi # 创建挂载点 mkdir -p "$SMB_MOUNT_POINT" local full_path="//$SMB_SERVER/$SMB_SHARE$SMB_REMOTE_PATH" echo -e "${BLUE}正在挂载SMB...${NC}" echo -e "共享: $full_path" echo -e "挂载点: $SMB_MOUNT_POINT" local mount_cmd if [ -z "$SMB_PASS" ]; then # 访客访问 mount_cmd="sudo mount -t cifs \"$full_path\" \"$SMB_MOUNT_POINT\" -o guest,uid=$(id -u),gid=$(id -g),iocharset=utf8,file_mode=0777,dir_mode=0777" else # 认证访问 mount_cmd="sudo mount -t cifs \"$full_path\" \"$SMB_MOUNT_POINT\" -o username=$SMB_USER,password=$SMB_PASS,domain=$SMB_DOMAIN,uid=$(id -u),gid=$(id -g),iocharset=utf8,file_mode=0777,dir_mode=0777" fi echo -e "${YELLOW}执行命令: $mount_cmd${NC}" if eval "$mount_cmd"; then echo -e "${GREEN}✓ SMB挂载成功${NC}" record_mount "SMB" "//$SMB_SERVER/$SMB_SHARE" "$SMB_REMOTE_PATH" "$SMB_MOUNT_POINT" else echo -e "${RED}✗ SMB挂载失败${NC}" echo -e "${YELLOW}提示:${NC}" echo -e " 1. 检查cifs-utils是否安装: sudo apt install cifs-utils" echo -e " 2. 检查共享地址是否正确" echo -e " 3. 尝试使用IP地址代替主机名" fi } umount_smb() { if mount | grep -q "$SMB_MOUNT_POINT"; then echo -e "${BLUE}正在卸载SMB...${NC}" sudo umount "$SMB_MOUNT_POINT" echo -e "${GREEN}✓ SMB卸载完成${NC}" fi } test_smb() { if [ -z "$SMB_SERVER" ] || [ -z "$SMB_SHARE" ]; then echo -e "${RED}请先配置SMB连接信息${NC}" return fi echo -e "${BLUE}测试SMB连接...${NC}" echo -e "测试共享: //$SMB_SERVER/$SMB_SHARE" # 使用smbclient测试 if command -v smbclient &> /dev/null; then if [ -z "$SMB_PASS" ]; then timeout 10 smbclient -L "$SMB_SERVER" -N > /dev/null 2>&1 else timeout 10 smbclient -L "$SMB_SERVER" -U "$SMB_USER%$SMB_PASS" -W "$SMB_DOMAIN" > /dev/null 2>&1 fi else # 使用ping测试 ping -c 1 -W 2 "$SMB_SERVER" > /dev/null 2>&1 fi if [ $? -eq 0 ]; then echo -e "${GREEN}✓ SMB服务器连接成功${NC}" # 测试具体共享 if [ -n "$SMB_REMOTE_PATH" ] && [ "$SMB_REMOTE_PATH" != "/" ]; then echo -e "${YELLOW}注意: SMB远程路径测试需要挂载后才能验证${NC}" fi else echo -e "${RED}✗ SMB连接测试失败${NC}" fi } # 快速URL导入 quick_import() { echo -e "${CYAN}=== 快速URL导入 ===${NC}" echo echo "支持的格式:" echo " FTP: ftp://[user:pass@]host:port[/path]" echo " WebDAV: http[s]://[user:pass@]host[/path]" echo " SMB: //server/share[/path]" echo read -p "输入URL: " url if [[ "$url" =~ ^ftp:// ]]; then echo -e "${GREEN}检测到FTP URL${NC}" parse_url "$url" "ftp" echo -e "服务器: $FTP_HOST" echo -e "用户名: $FTP_USER" echo -e "远端路径: $FTP_REMOTE_PATH" read -p "本地挂载点 [默认: $DEFAULT_MOUNT_BASE/ftp]: " mount_point FTP_MOUNT_POINT="${mount_point:-$DEFAULT_MOUNT_BASE/ftp}" save_config echo -e "${GREEN}FTP配置已导入${NC}" read -p "是否立即挂载?(y/N): " mount_now if [[ "$mount_now" =~ ^[Yy]$ ]]; then mount_ftp fi elif [[ "$url" =~ ^https?:// ]]; then echo -e "${YELLOW}检测到WebDAV URL${NC}" parse_url "$url" "webdav" echo -e "URL: $WEBDAV_URL" echo -e "远端路径: $WEBDAV_REMOTE_PATH" read -p "本地挂载点 [默认: $DEFAULT_MOUNT_BASE/webdav]: " mount_point WEBDAV_MOUNT_POINT="${mount_point:-$DEFAULT_MOUNT_BASE/webdav}" save_config echo -e "${GREEN}WebDAV配置已导入${NC}" read -p "是否立即挂载?(y/N): " mount_now if [[ "$mount_now" =~ ^[Yy]$ ]]; then mount_webdav fi elif [[ "$url" =~ ^// ]]; then echo -e "${PURPLE}检测到SMB URL${NC}" parse_url "$url" "smb" echo -e "服务器: $SMB_SERVER" echo -e "共享: $SMB_SHARE" echo -e "远端路径: $SMB_REMOTE_PATH" read -p "本地挂载点 [默认: $DEFAULT_MOUNT_BASE/smb]: " mount_point SMB_MOUNT_POINT="${mount_point:-$DEFAULT_MOUNT_BASE/smb}" save_config echo -e "${GREEN}SMB配置已导入${NC}" read -p "是否立即挂载?(y/N): " mount_now if [[ "$mount_now" =~ ^[Yy]$ ]]; then mount_smb fi else echo -e "${RED}无法识别的URL格式${NC}" fi } # 浏览远程目录(独立功能) browse_remote() { echo -e "${CYAN}=== 浏览远程目录 ===${NC}" echo echo "选择协议:" echo "1. FTP" echo "2. WebDAV" echo "3. SMB" echo "0. 返回" echo read -p "请选择: " choice case $choice in 1) if [ -z "$FTP_HOST" ]; then echo -e "${RED}请先配置FTP连接信息${NC}" configure_ftp else selected_path=$(remote_path_selector "ftp" "$FTP_REMOTE_PATH") echo -e "${GREEN}选择的路径: $selected_path${NC}" read -p "是否使用此路径?(y/N): " use_path if [[ "$use_path" =~ ^[Yy]$ ]]; then FTP_REMOTE_PATH="$selected_path" save_config echo -e "${GREEN}FTP远端路径已更新${NC}" fi fi ;; 2) if [ -z "$WEBDAV_URL" ]; then echo -e "${RED}请先配置WebDAV连接信息${NC}" configure_webdav else selected_path=$(remote_path_selector "webdav" "$WEBDAV_REMOTE_PATH") echo -e "${GREEN}选择的路径: $selected_path${NC}" read -p "是否使用此路径?(y/N): " use_path if [[ "$use_path" =~ ^[Yy]$ ]]; then WEBDAV_REMOTE_PATH="$selected_path" save_config echo -e "${GREEN}WebDAV远端路径已更新${NC}" fi fi ;; 3) if [ -z "$SMB_SERVER" ] || [ -z "$SMB_SHARE" ]; then echo -e "${RED}请先配置SMB连接信息${NC}" configure_smb else selected_path=$(remote_path_selector "smb" "$SMB_REMOTE_PATH") echo -e "${GREEN}选择的路径: $selected_path${NC}" read -p "是否使用此路径?(y/N): " use_path if [[ "$use_path" =~ ^[Yy]$ ]]; then SMB_REMOTE_PATH="$selected_path" save_config echo -e "${GREEN}SMB远端路径已更新${NC}" fi fi ;; 0) return ;; *) echo -e "${RED}无效选择${NC}" ;; esac } # 配置管理 configure_connections() { echo -e "${CYAN}=== 配置连接信息 ===${NC}" echo echo "1. 配置FTP连接" echo "2. 配置WebDAV连接" echo "3. 配置SMB/CIFS连接" echo "4. 查看所有配置" echo "0. 返回" echo read -p "请选择: " choice case $choice in 1) configure_ftp ;; 2) configure_webdav ;; 3) configure_smb ;; 4) show_configurations ;; 0) return ;; *) echo -e "${RED}无效选择${NC}" ;; esac } # 显示所有配置 show_configurations() { echo -e "${CYAN}[FTP配置]${NC}" echo " 服务器: $FTP_HOST:$FTP_PORT" echo " 用户名: $FTP_USER" echo " 密码: [已保存]" echo " 远端路径: $FTP_REMOTE_PATH" echo " 挂载点: $FTP_MOUNT_POINT" echo echo -e "${YELLOW}[WebDAV配置]${NC}" echo " URL: $WEBDAV_URL" echo " 用户名: $WEBDAV_USER" echo " 密码: [已保存]" echo " 远端路径: $WEBDAV_REMOTE_PATH" echo " 挂载点: $WEBDAV_MOUNT_POINT" echo echo -e "${PURPLE}[SMB配置]${NC}" echo " 服务器: $SMB_SERVER" echo " 共享: $SMB_SHARE" echo " 域名: $SMB_DOMAIN" echo " 用户名: $SMB_USER" echo " 密码: [已保存]" echo " 远端路径: $SMB_REMOTE_PATH" echo " 挂载点: $SMB_MOUNT_POINT" } # 测试连接 test_connections() { echo -e "${CYAN}=== 测试连接 ===${NC}" echo echo "1. 测试FTP连接" echo "2. 测试WebDAV连接" echo "3. 测试SMB连接" echo "4. 测试所有连接" echo "0. 返回" echo read -p "请选择: " choice case $choice in 1) test_ftp ;; 2) test_webdav ;; 3) test_smb ;; 4) echo -e "${BLUE}测试所有连接...${NC}" test_ftp test_webdav test_smb ;; 0) return ;; *) echo -e "${RED}无效选择${NC}" ;; esac } # 查看挂载历史 show_mount_history() { echo -e "${CYAN}=== 挂载历史 ===${NC}" if [ -f "$MOUNT_HISTORY" ]; then echo -e "${YELLOW}时间戳 协议 服务器 远端路径 挂载点${NC}" echo "-----------------------------------------------------------------------------------------------" tail -20 "$MOUNT_HISTORY" | while IFS='|' read -r timestamp protocol server remote_path mount_point; do printf "%-23s %-8s %-25s %-20s %s\n" "$timestamp" "$protocol" "$server" "$remote_path" "$mount_point" done else echo -e "${YELLOW}暂无挂载历史${NC}" fi } # 批量卸载所有 unmount_all() { echo -e "${RED}=== 卸载所有挂载 ===${NC}" local mounted=0 # 卸载FTP if mount | grep -q "$FTP_MOUNT_POINT"; then echo -n "卸载FTP... " fusermount -u "$FTP_MOUNT_POINT" 2>/dev/null && echo "✓" || echo "✗" mounted=1 fi # 卸载WebDAV if mount | grep -q "$WEBDAV_MOUNT_POINT"; then echo -n "卸载WebDAV... " sudo umount "$WEBDAV_MOUNT_POINT" 2>/dev/null && echo "✓" || echo "✗" mounted=1 fi # 卸载SMB if mount | grep -q "$SMB_MOUNT_POINT"; then echo -n "卸载SMB... " sudo umount "$SMB_MOUNT_POINT" 2>/dev/null && echo "✓" || echo "✗" mounted=1 fi if [ $mounted -eq 0 ]; then echo -e "${YELLOW}没有需要卸载的挂载${NC}" else echo -e "${GREEN}所有挂载已卸载${NC}" fi } # 清理挂载点 clean_mount_points() { echo -e "${RED}=== 清理挂载点 ===${NC}" echo "以下目录将被清空:" echo " 1. $FTP_MOUNT_POINT" echo " 2. $WEBDAV_MOUNT_POINT" echo " 3. $SMB_MOUNT_POINT" echo " 4. 所有以上目录" echo " 0. 取消" echo read -p "请选择: " choice case $choice in 1) if [ -d "$FTP_MOUNT_POINT" ]; then rm -rf "${FTP_MOUNT_POINT:?}/"* echo -e "${GREEN}FTP挂载点已清理${NC}" fi ;; 2) if [ -d "$WEBDAV_MOUNT_POINT" ]; then rm -rf "${WEBDAV_MOUNT_POINT:?}/"* echo -e "${GREEN}WebDAV挂载点已清理${NC}" fi ;; 3) if [ -d "$SMB_MOUNT_POINT" ]; then rm -rf "${SMB_MOUNT_POINT:?}/"* echo -e "${GREEN}SMB挂载点已清理${NC}" fi ;; 4) for dir in "$FTP_MOUNT_POINT" "$WEBDAV_MOUNT_POINT" "$SMB_MOUNT_POINT"; do if [ -d "$dir" ]; then rm -rf "${dir:?}/"* echo -e "${GREEN}$dir 已清理${NC}" fi done ;; 0) return ;; *) echo -e "${RED}无效选择${NC}" ;; esac } # 创建快捷命令 create_shortcuts() { echo -e "${CYAN}=== 创建快捷命令 ===${NC}" local script_path="$(realpath "$0")" local bin_dir="$HOME/bin" mkdir -p "$bin_dir" # 创建协议特定的快捷方式 cat > "$bin_dir/mount-ftp" << EOF #!/bin/bash "$script_path" --mount ftp EOF cat > "$bin_dir/mount-webdav" << EOF #!/bin/bash "$script_path" --mount webdav EOF cat > "$bin_dir/mount-smb" << EOF #!/bin/bash "$script_path" --mount smb EOF # 创建卸载快捷方式 cat > "$bin_dir/umount-all" << EOF #!/bin/bash "$script_path" --unmount-all EOF # 创建带路径的快捷方式 cat > "$bin_dir/mount-ftp-path" << EOF #!/bin/bash echo "当前远端路径: \$FTP_REMOTE_PATH" read -p "输入新的远端路径 (或回车使用当前): " new_path if [ -n "\$new_path" ]; then FTP_REMOTE_PATH="\$new_path" "$script_path" --save-config fi "$script_path" --mount ftp EOF # 设置执行权限 chmod +x "$bin_dir"/* # 添加到PATH if ! echo "$PATH" | grep -q "$bin_dir"; then echo -e "${YELLOW}请将以下行添加到 ~/.bashrc 或 ~/.bash_profile:${NC}" echo "export PATH=\"\$PATH:$bin_dir\"" echo echo -e "${BLUE}或执行以下命令立即生效:${NC}" echo "export PATH=\"\$PATH:$bin_dir\"" fi echo -e "${GREEN}快捷命令已创建到 $bin_dir${NC}" echo -e "${YELLOW}可用命令:${NC}" echo " mount-ftp # 挂载FTP" echo " mount-webdav # 挂载WebDAV" echo " mount-smb # 挂载SMB" echo " mount-ftp-path # 设置路径后挂载FTP" echo " umount-all # 卸载所有" } # 命令行参数处理 handle_cli_args() { case "$1" in --mount) case "$2" in ftp) mount_ftp ;; webdav) mount_webdav ;; smb) mount_smb ;; *) echo "用法: $0 --mount {ftp|webdav|smb}" exit 1 ;; esac exit 0 ;; --unmount-all) unmount_all exit 0 ;; --status) show_mount_status full exit 0 ;; --browse) browse_remote exit 0 ;; --import-url) quick_import exit 0 ;; --save-config) save_config exit 0 ;; --help) echo "多协议挂载管理工具 (支持远端目录)" echo "用法:" echo " $0 # 交互式模式" echo " $0 --mount ftp # 挂载FTP" echo " $0 --mount webdav # 挂载WebDAV" echo " $0 --mount smb # 挂载SMB" echo " $0 --unmount-all # 卸载所有" echo " $0 --status # 显示状态" echo " $0 --browse # 浏览远程目录" echo " $0 --import-url # 快速URL导入" echo " $0 --save-config # 保存配置" exit 0 ;; esac } # 设置开机自动挂载 setup_autostart() { echo -e "${CYAN}=== 设置开机自动挂载 ===${NC}" echo echo "注意:此功能需要root权限" echo echo "1. 创建FTP自动挂载服务" echo "2. 创建WebDAV自动挂载服务" echo "3. 创建SMB自动挂载服务" echo "4. 查看/etc/fstab示例(包含远端路径)" echo "0. 返回" echo read -p "请选择: " choice case $choice in 1) create_ftp_service ;; 2) create_webdav_service ;; 3) create_smb_service ;; 4) show_fstab_examples ;; 0) return ;; *) echo -e "${RED}无效选择${NC}" ;; esac } # 显示fstab示例(包含远端路径) show_fstab_examples() { echo -e "${YELLOW}/etc/fstab 配置示例 (包含远端路径):${NC}" echo echo "# FTP (需要先安装curlftpfs)" echo "# 格式: curlftpfs#ftp://user:pass@host:port/path /mnt/ftp fuse allow_other,_netdev,uid=1000,gid=1000 0 0" echo "curlftpfs#ftp://$FTP_USER:$FTP_PASS@$FTP_HOST:$FTP_PORT$FTP_REMOTE_PATH $FTP_MOUNT_POINT fuse allow_other,_netdev,uid=$(id -u),gid=$(id -g) 0 0" echo echo "# WebDAV" echo "# 格式: http://host/path /mnt/webdav davfs _netdev,noauto,user,uid=1000,gid=1000 0 0" echo "${WEBDAV_URL%/}$WEBDAV_REMOTE_PATH $WEBDAV_MOUNT_POINT davfs _netdev,noauto,user,uid=$(id -u),gid=$(id -g) 0 0" echo echo "# SMB/CIFS" echo "# 格式: //server/share/path /mnt/smb cifs username=user,password=pass,uid=1000,gid=1000,_netdev 0 0" echo "//$SMB_SERVER/$SMB_SHARE$SMB_REMOTE_PATH $SMB_MOUNT_POINT cifs username=$SMB_USER,password=$SMB_PASS,uid=$(id -u),gid=$(id -g),_netdev 0 0" echo echo -e "${RED}警告:密码会以明文形式存储在fstab中,请谨慎使用!${NC}" } # 主程序 main() { # 处理命令行参数 if [ $# -gt 0 ]; then handle_cli_args "$@" fi # 检查依赖 check_dependencies # 加载配置 load_config while true; do show_main_menu read -p "请选择操作 [0-7]: " choice case $choice in 1) # 协议选择 while true; do show_protocol_menu read -p "选择协议 [0-7]: " protocol_choice case $protocol_choice in 1) echo -e "\n${GREEN}[FTP操作]${NC}" echo "1. 挂载FTP" echo "2. 卸载FTP" echo "3. 配置FTP" echo "4. 浏览FTP目录" echo "0. 返回" read -p "请选择: " ftp_op case $ftp_op in 1) mount_ftp ;; 2) umount_ftp ;; 3) configure_ftp ;; 4) browse_remote ;; 0) continue ;; *) echo -e "${RED}无效选择${NC}" ;; esac ;; 2) echo -e "\n${YELLOW}[WebDAV操作]${NC}" echo "1. 挂载WebDAV" echo "2. 卸载WebDAV" echo "3. 配置WebDAV" echo "4. 浏览WebDAV目录" echo "0. 返回" read -p "请选择: " webdav_op case $webdav_op in 1) mount_webdav ;; 2) umount_webdav ;; 3) configure_webdav ;; 4) browse_remote ;; 0) continue ;; *) echo -e "${RED}无效选择${NC}" ;; esac ;; 3) echo -e "\n${PURPLE}[SMB操作]${NC}" echo "1. 挂载SMB" echo "2. 卸载SMB" echo "3. 配置SMB" echo "4. 浏览SMB目录" echo "0. 返回" read -p "请选择: " smb_op case $smb_op in 1) mount_smb ;; 2) umount_smb ;; 3) configure_smb ;; 4) browse_remote ;; 0) continue ;; *) echo -e "${RED}无效选择${NC}" ;; esac ;; 4) show_mount_status full ;; 5) unmount_all ;; 6) clean_mount_points ;; 7) quick_import ;; 0) break ;; *) echo -e "${RED}无效选择${NC}" ;; esac echo read -p "按回车键继续..." done ;; 2) configure_connections ;; 3) test_connections ;; 4) show_mount_history ;; 5) setup_autostart ;; 6) create_shortcuts ;; 7) browse_remote ;; 0) echo -e "${GREEN}感谢使用,再见!${NC}" exit 0 ;; *) echo -e "${RED}无效选择,请重新输入${NC}" ;; esac echo read -p "按回车键继续..." done } # 运行主程序 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi
2025年04月28日
3 阅读
0 评论
0 点赞
2025-04-19
Linux挂载FTP为本地目录
1.挂载脚本#!/bin/bash # ftp_mount.sh FTP_HOST="ftp.example.com" FTP_USER="your_username" FTP_PASS="your_password" MOUNT_POINT="/mnt/ftp" # 检查挂载点是否存在 if [ ! -d "$MOUNT_POINT" ]; then sudo mkdir -p "$MOUNT_POINT" fi # 检查是否已挂载 if mount | grep -q "$MOUNT_POINT"; then echo "FTP already mounted at $MOUNT_POINT" else # 挂载FTP curlftpfs -o allow_other,user=$FTP_USER:$FTP_PASS "$FTP_HOST" "$MOUNT_POINT" if [ $? -eq 0 ]; then echo "FTP mounted successfully at $MOUNT_POINT" else echo "Failed to mount FTP" fi fi2.卸载脚本#!/bin/bash # ftp_umount.sh MOUNT_POINT="/mnt/ftp" fusermount -u "$MOUNT_POINT"3.使用方法1.创建ftp_mount.sh文件,复制上述代码,将信息修改为自己的FTP服务器信息;2.运行:bash ftp_mount.sh
2025年04月19日
1 阅读
0 评论
0 点赞
2025-03-25
Linux系统查找同名文件管理删除操作Shell脚本
#!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 无颜色 # 显示帮助信息 show_help() { echo -e "${BLUE}同名文件查找和管理工具${NC}" echo "用法: $0 [选项] [目录]" echo "选项:" echo " -h, --help 显示此帮助信息" echo " -r, --recursive递归查找子目录" echo " -d, --delete 直接进入删除模式" echo " -s, --size 显示文件大小" echo " -t, --time 显示修改时间" echo "" echo "示例:" echo " $0 ~/Downloads # 查找指定目录" echo " $0 -r ~/Documents # 递归查找" echo " $0 -s -t . # 显示详细信息" } # 查找同名文件 find_duplicate_names() { local target_dir="$1" local recursive="$2" echo -e "${BLUE}正在扫描目录: $target_dir${NC}" echo -e "${BLUE}================================${NC}" # 使用不同的find命令根据递归选项 if [ "$recursive" = true ]; then find_cmd="find \"$target_dir\" -type f" else find_cmd="find \"$target_dir\" -maxdepth 1 -type f" fi # 查找所有文件并统计同名文件 eval $find_cmd | while IFS= read -r file; do filename=$(basename "$file") echo "$filename|$file" done | sort | uniq -c | grep -v '^ *1 ' | while read count line; do filename=$(echo "$line" | cut -d'|' -f1) filepath=$(echo "$line" | cut -d'|' -f2) # 统计同名文件数量 actual_count=$(eval $find_cmd -name "$filename" | wc -l) if [ $actual_count -gt 1 ]; then echo -e "${YELLOW}\n发现 $actual_count 个同名文件: $filename${NC}" # 显示每个文件的信息 file_num=1 eval $find_cmd -name "$filename" | while IFS= read -r duplicate; do if [ "$show_size" = true ]; then size=$(du -h "$duplicate" | cut -f1) size_info="大小: $size" else size_info="" fi if [ "$show_time" = true ]; then mtime=$(stat -c "%y" "$duplicate" | cut -d'.' -f1) time_info="修改时间: $mtime" else time_info="" fi echo -e "${GREEN}[$file_num] ${duplicate}${NC}" if [ -n "$size_info" ] || [ -n "$time_info" ]; then echo " $size_info $time_info" fi file_num=$((file_num + 1)) done fi done } # 删除文件处理 handle_deletion() { local target_dir="$1" local recursive="$2" echo -e "${RED}\n警告: 删除模式${NC}" echo -e "${RED}================================${NC}" # 查找所有文件 if [ "$recursive" = true ]; then find_cmd="find \"$target_dir\" -type f" else find_cmd="find \"$target_dir\" -maxdepth 1 -type f" fi # 收集所有文件名 eval $find_cmd | while IFS= read -r file; do filename=$(basename "$file") echo "$filename|$file" done | sort | uniq -c | grep -v '^ *1 ' | while read count line; do filename=$(echo "$line" | cut -d'|' -f1) filepath=$(echo "$line" | cut -d'|' -f2) # 统计同名文件 duplicates=($(eval $find_cmd -name "$filename")) actual_count=${#duplicates[@]} if [ $actual_count -gt 1 ]; then echo -e "${YELLOW}\n处理文件: $filename (共 $actual_count 个)${NC}" # 显示文件列表 for i in "${!duplicates[@]}"; do echo -e "${GREEN}[$((i+1))] ${duplicates[i]}${NC}" done # 获取用户选择 echo -e "${BLUE}请选择操作:${NC}" echo " [0] 跳过此文件" echo " [1-$actual_count] 删除对应文件" echo " [a] 删除所有同名文件" echo " [k] 保留所有并继续" read -p "请输入选择: " choice case $choice in 0) echo "跳过 $filename" ;; a) echo -e "${RED}删除所有 $actual_count 个文件${NC}" for file in "${duplicates[@]}"; do rm -v "$file" done ;; k) echo "保留所有文件" ;; [1-9]*) if [[ $choice =~ ^[0-9]+$ ]] && [ $choice -ge 1 ] && [ $choice -le $actual_count ]; then file_to_delete="${duplicates[$((choice-1))]}" echo -e "${RED}删除文件: $file_to_delete${NC}" rm -v "$file_to_delete" else echo "无效的选择" fi ;; *) echo "无效的输入" ;; esac fi done } # 主函数 main() { # 默认值 target_dir="." recursive=false delete_mode=false show_size=false show_time=false # 解析参数 while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -r|--recursive) recursive=true shift ;; -d|--delete) delete_mode=true shift ;; -s|--size) show_size=true shift ;; -t|--time) show_time=true shift ;; -*) echo -e "${RED}未知选项: $1${NC}" show_help exit 1 ;; *) target_dir="$1" shift ;; esac done # 检查目录是否存在 if [ ! -d "$target_dir" ]; then echo -e "${RED}错误: 目录不存在: $target_dir${NC}" exit 1 fi # 检查是否安装必要工具 if ! command -v find &> /dev/null; then echo -e "${RED}错误: find 命令未找到${NC}" exit 1 fi # 执行相应模式 if [ "$delete_mode" = true ]; then handle_deletion "$target_dir" "$recursive" else find_duplicate_names "$target_dir" "$recursive" # 询问是否进入删除模式 echo -e "\n${BLUE}================================${NC}" read -p "是否要进入删除模式?(y/N): " answer if [[ $answer =~ ^[Yy]$ ]]; then handle_deletion "$target_dir" "$recursive" fi fi echo -e "${GREEN}\n操作完成!${NC}" } # 执行主函数 main "$@"使用方法1.保存脚本# 将脚本保存为 find_duplicates.sh chmod +x find_duplicates.sh2.基本用法# 在当前目录查找同名文件 ./find_duplicates.sh # 在指定目录查找 ./find_duplicates.sh ~/Downloads # 递归查找 ./find_duplicates.sh -r ~/Documents3.显示详细信息# 显示文件大小和修改时间 ./find_duplicates.sh -s -t . # 直接进入删除模式 ./find_duplicates.sh -d ~/Downloads
2025年03月25日
1 阅读
0 评论
0 点赞
2025-03-11
MySQL数据库常用命令
批量替换数据:UPDATE table_name SET column_name = REPLACE(column_name,'old_pattern','new_pattern');
2025年03月11日
4 阅读
0 评论
0 点赞
2024-12-21
Debian电源配置文件解读
配置文件:/etc/systemd/logind.confpoweroff #关闭 hibernate #休眠 suspend #暂停 ignore #不执行任何操作 reboot #重启 lock #锁定屏幕 --------------------------------------- HandlePowerKey=poweroff # 按下电源按键 HandlePowerKeyLongPress=ignore #长按电源键 HandleRebootKey=reboot #按下重启键 HandleRebootKeyLongPress=poweroff #长按重启键 HandleSuspendKey=suspend #按下暂停键 HandleSuspendKeyLongPress=hibernate #长按暂停键 HandleHibernateKey=hibernate #按下休眠键 HandleHibernateKeyLongPress=ignore #长按休眠键 HandleLidSwitch=suspend #关闭笔记本盖子 HandleLidSwitchExternalPower=suspend #外接电源时关闭笔记本盖子 HandleLidSwitchDocked=ignore #连接电源时关闭笔记本盖子 PowerKeyIgnoreInhibited=no #是否忽略阻止操作的电源键按下 SuspendKeyIgnoreInhibited=no #是否忽略阻止操作的暂停键按下 HibernateKeyIgnoreInhibited=no #是否忽略阻止操作的休眠键按下 LidSwitchIgnoreInhibited=yes #是否忽略阻止操作的盖子关闭 RebootKeyIgnoreInhibited=no #是否忽略阻止操作的重启键按下 HoldoffTimeoutSec=30s #在执行操作前等待的时间 IdleAction=ignore #系统处于空闲状态时的操作 IdleActionSec=30min #系统处于空闲状态多长时间后执行操作 RuntimeDirectorySize=10% #运行时目录的最大大小,此处设置为总磁盘空间的10% RuntimeDirectoryInodesMax= #设置运行时目录中允许的最大inode数量 RemoveIPC=yes #是否在用户注销时删除IPC对象 InhibitorsMax=8192 #系统允许的阻止操作的最大数量 SessionsMax=8192 #允许的最大连接会话数量 StopIdleSessionSec=infinity #设置在系统空闲时自动停止会话的超时时间
2024年12月21日
101 阅读
0 评论
0 点赞
1
2
3
4
...
6
网站公告
×
欢迎访问本站
如果你有教程想要分享,请
联系我们