中文由于编码格式的原因,有时候在数据读取或者处理时候带来一些不必要的麻烦,可以用英文替换一路径名称,或者文件名称,方便使用,减少报错,节省点人力成本去搞编码格式。
另外,shell中是可以写一堆规则去一个个sed, 但是比较麻烦,不如把一揽子的规则抽象出来,统一替换,这个还能遍历文件,目录,子目录,替换文件夹的名字以及子目录名字。
复制这个模板,改成实际的路径,定义好映射的规则,一键使用,全部替换
#!/bin/bash
# 根目录
ROOT_DIR="/d/urfolder/test"
# 定义中文到英文的映射规则
declare -A REPLACE_RULES=(
["中文名"]="cname"
["英文名"]="ename"
["年龄"]="age"
)
# 替换文件名或目录名中的中文为指定英文
replace_chinese_with_english() {
local name="$1"
for zh in "${!REPLACE_RULES[@]}"; do
local en="${REPLACE_RULES[$zh]}"
name=$(echo "$name" | sed "s/$zh/$en/g")
done
echo "$name"
}
# 遍历目录并处理文件和子目录
rename_files_and_dirs() {
local current_dir="$1"
# 先处理文件
echo "Working on file rename loop"
find "$current_dir" -maxdepth 1 -type f | while read file; do
filename=$(basename "$file") #/d/urfolder/test/test.csv test.csv
new_filename=$(replace_chinese_with_english "$filename")
if [[ "$filename" != "$new_filename" ]]; then
mv "$file" "$current_dir/$new_filename"
echo "重命名文件: $file -> $current_dir/$new_filename"
fi
done
# 再处理子目录
echo "Working on directory rename loop"
find "$current_dir" -maxdepth 1 -type d | while read dir; do
dirname=$(basename "$dir") #basename /d/urfolder/test/007 007
new_dirname=$(replace_chinese_with_english "$dirname")
if [[ "$dirname" != "$new_dirname" ]]; then
mv "$dir" "$current_dir/$new_dirname"
echo "重命名目录: $dir -> $current_dir/$new_dirname"
fi
done
# 遍历子目录,递归处理
echo "Working on sub-directory rename loop"
find "$current_dir" -mindepth 1 -maxdepth 1 -type d | while read subdir; do
rename_files_and_dirs "$subdir"
done
}
# 开始处理
rename_files_and_dirs "$ROOT_DIR"