使用终端将文件夹中的文件名称以父级文件夹名称来重命名

3个月前 / Directory:MAC / Views:146

在Mac系统中,可以通过终端使用Shell脚本批量重命名文件。以下是详细步骤:

方法1:为每个文件添加序号避免冲突

此方法会将每个子文件夹中的文件命名为父文件夹名加序号,保留原扩展名。

  1. 打开终端,进入包含文件夹a的目录。

  2. 创建脚本文件 rename_script.sh

nano rename_script.sh

粘贴以下内容

#!/bin/bash
cd a  # 进入文件夹a
for dir in */; do
  parent_name=$(basename "$dir")
  cd "$dir"
  count=1
  for file in *; do
    if [ -f "$file" ]; then
      filename=$(basename -- "$file")
      extension=""
      if [[ "$filename" == *.* && ! "$filename" =~ ^\..*$ ]]; then
        extension="${filename##*.}"
      fi
      if [ -n "$extension" ]; then
        newname="${parent_name}_${count}.${extension}"
      else
        newname="${parent_name}_${count}"
      fi
      # 确保文件名唯一
      while [ -e "$newname" ]; do
        ((count++))
        if [ -n "$extension" ]; then
          newname="${parent_name}_${count}.${extension}"
        else
          newname="${parent_name}_${count}"
        fi
      done
      mv -- "$file" "$newname"
      ((count++))
    fi
  done
  cd ..
done
echo "文件已重命名!"
  1. 保存并退出:按 Ctrl+O,回车,再按 Ctrl+X

  2. 赋予执行权限

chmod +x rename_script.sh

运行脚本

./rename_script.sh


方法2:直接使用父文件夹名(可能覆盖文件)

此方法直接使用父文件夹名作为文件名,若同一文件夹内有多个同类型文件会覆盖。

#!/bin/bash
cd a
for dir in */; do
  parent_name=$(basename "$dir")
  cd "$dir"
  for file in *; do
    if [ -f "$file" ]; then
      filename=$(basename -- "$file")
      extension=""
      if [[ "$filename" == *.* && ! "$filename" =~ ^\..*$ ]]; then
        extension="${filename##*.}"
      fi
      newname="$parent_name"
      [ -n "$extension" ] && newname+=".$extension"
      # 添加防覆盖检查
      if [ -e "$newname" ]; then
        echo "警告:跳过 '$file','$newname' 已存在。"
      else
        mv -- "$file" "$newname"
      fi
    fi
  done
  cd ..
done
echo "操作完成!注意检查可能的重名问题。"

操作说明

  • 备份数据:运行前建议备份文件夹,防止意外。

  • 脚本路径:确保终端当前目录正确,或修改脚本中的路径。

  • 扩展名处理:脚本已处理无扩展名及隐藏文件(如.txt)的情况。

选择方法1可安全处理多文件,方法2适用于确认无重名的场景。