Mac

Mac删除空文件夹

Posted by dm on January 8, 2025

✔ 自动清理:

  • Desktop 下的 .~* / ._*
  • 企业微信缓存目录里的 隐藏文件 + 空文件夹

✔ 安全机制:

  • 企业微信运行中 → 不清理
  • 支持 Dry-Run 预演
  • 日志记录 + 30 天自动清理

✔ 自动化方式:

  • 每周定时(launchd)
  • 菜单栏一键手动执行

一、创建脚本(核心,只做一次)

① 创建脚本目录

mkdir -p ~/scripts

② 创建清理脚本

vim ~/scripts/clean_mac_junk.sh

⬇️ 粘贴以下【完整脚本内容】⬇️

#!/bin/zsh

########################
# 配置区
########################
LOG_DIR="$HOME/Library/Logs/cleanup"
LOG_FILE="$LOG_DIR/cleanup_$(date +%Y-%m).log"

# true = 预演(不删除) / false = 正式删除
DRY_RUN=false

# 企业微信进程名
WEWORK_PROCESS="WeWork"

# 清理目标目录
TARGET_DIRS=(
  "$HOME/Desktop"
  "$HOME/Library/Containers/com.tencent.WeWorkMac/Data/Documents/Profiles/2DB1619D4101B5492622BC2CCD0F9193/Caches/Files"
)

########################
# 工具函数
########################
log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

run_cmd() {
  if $DRY_RUN; then
    log "[DRY-RUN] $*"
  else
    eval "$@"
  fi
}

########################
# 前置检查
########################
mkdir -p "$LOG_DIR"

# 企业微信运行中则跳过
if pgrep -x "$WEWORK_PROCESS" >/dev/null; then
  log "企业微信正在运行,跳过清理"
  exit 0
fi

log "===== 清理任务开始 ====="

########################
# 清理逻辑
########################
for dir in "${TARGET_DIRS[@]}"; do
  if [[ -d "$dir" ]]; then
    log "扫描目录:$dir"

    SIZE_BEFORE=$(du -sk "$dir" 2>/dev/null | awk '{print $1}')

    run_cmd "find '$dir' -type f \\( -name '.~*' -o -name '._*' \\) -delete 2>/dev/null"
    run_cmd "find '$dir' -depth -type d -empty -delete 2>/dev/null"

    SIZE_AFTER=$(du -sk "$dir" 2>/dev/null | awk '{print $1}')
    SAVED=$((SIZE_BEFORE - SIZE_AFTER))

    log "释放空间:${SAVED} KB"
  else
    log "目录不存在,跳过:$dir"
  fi
done

########################
# 日志保留 30 天
########################
find "$LOG_DIR" -type f -name "cleanup_*.log" -mtime +30 -delete

log "===== 清理任务结束 ====="
echo "" >> "$LOG_FILE"

③ 保存并赋予执行权限

chmod +x ~/scripts/clean_mac_junk.sh

④ 手动测试一次(推荐)

~/scripts/clean_mac_junk.sh

无报错即可 ✅


二、(可选)Dry-Run 预演模式

如果你想先看看会删什么:

nano ~/scripts/clean_mac_junk.sh

把:

DRY_RUN=false

改成:

DRY_RUN=true

保存后执行:

~/scripts/clean_mac_junk.sh

看日志确认无误后,再改回 false。


三、设置定时自动运行(launchd)

① 创建 plist

nano ~/Library/LaunchAgents/com.user.clean.mac.junk.plist

⬇️ 粘贴内容(⚠️把用户名换成你的)⬇️

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.clean.mac.junk</string>

    <key>ProgramArguments</key>
    <array>
        <string>/bin/zsh</string>
        <string>/Users/mingdong/scripts/clean_mac_junk.sh</string>
    </array>

    <key>StartCalendarInterval</key>
    <dict>
        <key>Weekday</key>
        <integer>1</integer>
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>

    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

② 加载任务

launchctl unload ~/Library/LaunchAgents/com.user.clean.mac.junk.plist 2>/dev/null
launchctl load ~/Library/LaunchAgents/com.user.clean.mac.junk.plist

验证

launchctl list | grep mac.junk

有输出即成功 ✅


四、创建菜单栏一键执行(Automator)

① 打开

Automator

  • 新建 → 应用程序

② 添加动作

  • 搜索 “运行 Shell 脚本”
  • Shell 选择:
/bin/zsh

脚本内容:

~/scripts/clean_mac_junk.sh

③ 保存

  • 名称:
🧹 Mac 清理器
  • 位置:
Applications

④ 常驻菜单栏

  • 系统设置 → 通用 → 登录项
  • 添加 🧹 Mac 清理器.app

五、日志查看位置(非常重要)

~/Library/Logs/cleanup/

查看:

ls ~/Library/Logs/cleanup

六、你现在拥有的最终能力清单

✔ 自动 + 手动

✔ 安全(WeWork 运行保护)

✔ 可审计(日志)

✔ 可预演(Dry-Run)

✔ 可长期运行


🧠 一句话总结

你现在这套,是 macOS 高级用户 / DevOps 级别的完整自动维护方案

放着跑,几年都不用再管。


删除.DS_Store文件

删除 DS_Store文件完全是安全的操作,它不会损害电脑,也不会造成个人数据丢失。删除后,「访达」在打开文件夹是会以默认显示模式显示文件夹。在你进行某些「访达」操作后,系统又会在后台自动创建DS_Store文件。

find . -name '.DS_Store' -type f -delete

到这里,当前文件夹目录下的所有.DS_Store文件都会消失。

查询空文件夹

find . -type d -empty

运行这个命令时,它会列出所有符合这些条件的空目录。

是一个在 Unix/Linux 系统中使用的命令,用于查找当前目录(.表示当前目录)及其子目录下所有为空的目录。这条命令的组成部分如下:

  • find:这是用来搜索文件和目录的标准命令。
  • .:这代表从当前目录开始搜索。你可以替换为任何其他路径以指定不同的搜索起点。
  • -type d:这是一个测试条件,告诉 find 命令只匹配类型为目录 (d) 的条目。如果你想要查找文件而不是目录,可以将 d 改为 f
  • -empty:这是另一个测试条件,它告诉 find 只选择那些内容为空的文件或目录。对于目录来说,这意味着它们不包含任何文件或子目录。

删除空文件夹

find . -type d -empty -delete

如果你想对找到的每个空目录执行某些操作,例如删除它们,可以在命令末尾添加 -delete 选项