使用终端将文件夹中的文件名称以父级文件夹名称来重命名
3个月前 /
Directory:MAC
/
Views:146
在Mac系统中,可以通过终端使用Shell脚本批量重命名文件。以下是详细步骤:
方法1:为每个文件添加序号避免冲突
此方法会将每个子文件夹中的文件命名为父文件夹名加序号,保留原扩展名。
打开终端,进入包含文件夹
a
的目录。创建脚本文件
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 "文件已重命名!"
保存并退出:按
Ctrl+O
,回车,再按Ctrl+X
。赋予执行权限:
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适用于确认无重名的场景。