如何用Bash删除文档根目录下各CMS的所有缓存目录
通用Bash脚本清理多CMS缓存目录方案
我完全理解你不想依赖WP-CLI、Drush这类专属工具,想要一个纯Bash的通用方案来清理文档根目录下WordPress、Drupal、Magento这三个应用的缓存。下面是一个实用的实现思路和脚本,兼顾兼容性和安全性:
核心思路
通过识别每个CMS的特征文件(比如WordPress的wp-config.php)来判断应用类型,再根据预定义的对应缓存目录进行清理,不需要依赖任何第三方工具。
完整Bash脚本
#!/bin/bash # 替换为你的实际文档根目录路径 DOC_ROOT="/var/www/html" # 定义CMS特征文件与缓存目录的映射 # 格式:["CMS名称"]="特征文件列表|缓存目录列表" declare -A cms_configs=( ["WordPress"]="wp-config.php|wp-content/cache wp-content/uploads/cache" ["Drupal"]="index.php drupal|sites/default/files/cache sites/default/files/php var/cache" ["Magento"]="app/etc/env.php|var/cache var/page_cache var/view_preprocessed pub/static/frontend pub/static/adminhtml" ) # 遍历文档根目录下的所有应用子目录 for app_dir in "${DOC_ROOT}"/*/; do # 处理路径格式,去掉末尾斜杠 app_dir=$(dirname "${app_dir}") app_name=$(basename "${app_dir}") echo "=== 检查应用目录:${app_name} ===" # 匹配当前目录对应的CMS类型 for cms in "${!cms_configs[@]}"; do # 拆分特征文件和缓存目录配置 IFS='|' read -r signature_files cache_dirs <<< "${cms_configs[$cms]}" is_matched=true # 验证所有特征文件是否存在 for sig_file in ${signature_files}; do if [ ! -f "${app_dir}/${sig_file}" ]; then is_matched=false break fi done if [ "${is_matched}" = true ]; then echo "识别为${cms}应用,开始清理缓存..." # 逐个清理缓存目录 for cache_dir in ${cache_dirs}; do full_cache_path="${app_dir}/${cache_dir}" if [ -d "${full_cache_path}" ]; then # 仅删除目录内的文件,保留目录本身(如需删除目录,去掉/*即可) rm -rf "${full_cache_path}"/* echo "✅ 已清理:${full_cache_path}" else echo "ℹ️ 缓存目录不存在,跳过:${full_cache_path}" fi done echo "✅ ${cms}缓存清理完成!" echo "" # 找到匹配的CMS后跳出循环,避免重复判断 break fi done done
脚本优势说明
- 无依赖:纯Bash实现,不需要安装任何CMS专属CLI工具,适合各种环境
- 安全可靠:先检查缓存目录是否存在再执行删除,避免因目录不存在抛出错误
- 灵活扩展:如果需要添加其他CMS(比如Joomla),只需在
cms_configs数组中新增条目即可,格式和现有配置一致 - 可控性强:默认只删除缓存目录内的文件,保留目录结构;如果需要彻底删除目录,修改
rm命令即可
注意事项
- 权限问题:确保运行脚本的用户(比如
www-data或root)对所有缓存目录拥有读写权限 - 自定义缓存:如果你的CMS使用了非默认缓存路径,需要手动在
cms_configs中添加对应的目录 - 测试先行:正式运行前,可以把
rm -rf替换成echo "将清理:",先预览要操作的内容,避免误删重要文件
内容的提问来源于stack exchange,提问作者Arcticooling
相关产品推荐
相关产品推荐

