编辑
2025-02-08
随笔
00
请注意,本文编写于 53 天前,最后修改于 53 天前,其中某些信息可能已经过时。

记录一下去重脚本

脚本一:去除哈希后缀

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 许可协议。转载请注明出处!