编写Bash脚本实现文件移至回收站并在重名时递增命名
修复你的Bash回收站脚本
我来帮你搞定这个脚本,先说说你原脚本里的几个关键问题,再给你一个能正常运行的版本:
原脚本的核心问题
- if条件语法错误:
if $fileName in ~/.TRASH不是Bash判断文件是否存在的正确写法,得用文件存在性检查的语法 - 命名递增逻辑缺失:你只想着直接加1,但没考虑重复多次的情况(比如
file1-1存在时要变成file1-2),需要循环检查直到找到可用的文件名 - 变量引用不严谨:没给变量加双引号,遇到带空格或特殊字符的文件名会直接报错
- rename命令用法错误:Bash的rename命令语法和你想的不一样,这里用
mv实现移动+重命名更直接
修正后的完整脚本
#!/bin/bash # 定义回收站路径,方便后续维护 TRASH_DIR="$HOME/.TRASH" # 确保回收站目录存在,不存在则自动创建 mkdir -p "$TRASH_DIR" # 提示用户输入文件名,-r选项避免反斜杠被转义 echo "请输入要移动的文件名:" read -r fileName # 先检查用户输入的文件是否真实存在 if [ ! -e "$fileName" ]; then echo "错误:文件 '$fileName' 不存在!" exit 1 fi # 初始化目标文件名,先尝试用原文件名 target_name="$fileName" # 循环检查目标文件名在回收站中是否存在,存在则递增命名 while [ -e "$TRASH_DIR/$target_name" ]; do # 用正则表达式判断当前文件名是否已经带递增后缀(比如file1-1) if [[ "$target_name" =~ ^(.*)-([0-9]+)$ ]]; then # 拆分出基础文件名和当前数字后缀 base_name="${BASH_REMATCH[1]}" current_num="${BASH_REMATCH[2]}" # 数字加1生成新后缀 new_num=$((current_num + 1)) target_name="${base_name}-${new_num}" else # 如果是第一次重复,直接加-1后缀 target_name="${fileName}-1" fi done # 移动文件到回收站并显示操作过程 mv -v "$fileName" "$TRASH_DIR/$target_name" echo "文件已成功移入回收站,命名为:$target_name"
关键部分解释
mkdir -p "$TRASH_DIR":确保回收站目录存在,即使之前没有也不会报错read -r fileName:更安全的读取用户输入,避免特殊字符被转义- 循环检查命名:通过正则表达式识别已有的数字后缀,自动递增,直到找到回收站中不存在的文件名
mv -v:-v选项会显示移动的详细过程,让你清楚看到文件的去向
内容的提问来源于stack exchange,提问作者user8707725
相关产品推荐
相关产品推荐

