记录一下去重脚本
脚本一:去除哈希后缀
shell#!/bin/zsh
echo "========== 开始检测重复文件 =========="
# 定义匹配哈希值和编号的正则表达式
hash_pattern='-[a-f0-9]{8,}$' # 例如:-d0a43534a7a7
number_pattern='([0-9]+)$' # 例如:(1)
typeset -A files # 定义 Zsh 关联数组
# 遍历当前目录下的所有 mp3 文件
while IFS= read -r file; do
base_name="${file%.mp3}" # 去掉 .mp3 扩展名
clean_name=$(echo "$base_name" | sed -E "s/$hash_pattern//; s/$number_pattern//")
# 确保 files[$clean_name] 是数组
if [[ -n "${files[$clean_name]}" ]]; then
files[$clean_name]+="|$file" # 用 | 连接文件路径,避免路径分割问题
else
files[$clean_name]="$file"
fi
done < <(find . -type f -name "*.mp3" -print0 | xargs -0 -I{} echo {})
# 遍历每个去重后的文件名组
for key in "${(@k)files}"; do
file_list=("${(@s:|:)files[$key]}") # 用 | 分割文件路径,转换为数组
if [[ ${#file_list[@]} -gt 1 ]]; then
echo ">>> 检测到重复文件:$key"
for f in "${file_list[@]}"; do
echo " - \"$f\""
done
# 选出最短文件名作为保留项,并确保 `min_file` 不为空
min_file=""
for f in "${file_list[@]}"; do
if [[ -z "$min_file" || ${#f} -lt ${#min_file} ]]; then
min_file="$f"
fi
done
echo " ✅ 保留文件: \"$min_file\""
# 删除其他文件
for f in "${file_list[@]}"; do
if [[ "$f" != "$min_file" ]]; then
echo " ❌ 删除: \"$f\""
rm "$f"
fi
done
fi
done
echo "========== 去重完成! =========="
本文作者:phae
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!