使用终端将文件夹中的文件名称以父级文件夹名称来重命名
1年前 /
Directory:MAC
/
Views:285
在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适用于确认无重名的场景。