编写Bash脚本:复制目录文件并替换文件名中的keyspace为newkeyspace_456
多目录文件复制并重命名的Bash脚本实现
这里有一个完全符合你需求的Bash脚本,它会自动处理Main_folder/keyspace下所有表子目录的文件复制与重命名操作,确保每个文件都能放到newkeyspace_456对应的子目录中,同时替换文件名里的标识字符串:
#!/bin/bash # 定义源目录和目标目录路径,可根据实际情况修改 SOURCE_DIR="./Main_folder/keyspace" TARGET_DIR="./Main_folder/newkeyspace_456" # 检查源目录是否存在,不存在则退出脚本 if [ ! -d "$SOURCE_DIR" ]; then echo "错误:源目录 $SOURCE_DIR 不存在,请检查路径是否正确" exit 1 fi # 遍历源目录下的所有表子目录 for table_dir in "$SOURCE_DIR"/*/; do # 获取当前表子目录的名称(去掉完整路径) table_name=$(basename "$table_dir") # 拼接目标子目录的完整路径 target_table_dir="$TARGET_DIR/$table_name" # 创建目标子目录(-p参数确保父目录不存在时自动创建,且目录已存在不会报错) mkdir -p "$target_table_dir" # 遍历当前表子目录下的所有文件 for file in "$table_dir"*; do # 只处理文件,跳过可能存在的子目录 if [ -f "$file" ]; then # 获取原始文件名(去掉路径部分) original_filename=${file##*/} # 替换文件名中的"keyspace"为"newkeyspace_456" new_filename=${original_filename//keyspace/newkeyspace_456} # 复制文件到目标子目录并重命名 cp "$file" "$target_table_dir/$new_filename" # 可选:打印操作日志,方便查看进度 echo "已复制并重命名:$file -> $target_table_dir/$new_filename" fi done done echo "所有文件复制操作完成!"
脚本关键逻辑解释
- 路径定义:开头的
SOURCE_DIR和TARGET_DIR变量可以直接修改,适配你的实际目录结构,不用改动脚本核心逻辑。 - 目录检查:先验证源目录是否存在,避免后续操作报错。
- 子目录遍历:
for table_dir in "$SOURCE_DIR"/*/会匹配keyspace下的所有子目录,也就是各个表的目录。 - 目标目录创建:
mkdir -p确保目标子目录存在,即使newkeyspace_456本身不存在也会自动创建。 - 文件名替换:使用Bash的参数替换
${original_filename//keyspace/newkeyspace_456},可以一次性替换文件名中所有出现的keyspace字符串。 - 文件复制:
cp命令直接完成复制+重命名的操作,一步到位。
使用说明
- 将脚本保存为
copy_rename_files.sh - 赋予执行权限:
chmod +x copy_rename_files.sh - 在脚本所在目录运行:
./copy_rename_files.sh
比如你给出的示例文件keyspace/tableA-12323/keyspace-tableA-12323-ka-1-Data.db,执行脚本后会被复制到newkeyspace_456/tableA-12323/newkeyspace_456-tableA-12323-ka-1-Data.db,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Hyder Tom
相关产品推荐
相关产品推荐

