#!/bin/bash # Nextcloud 文件管理脚本 # 用于管理员查看和管理用户文件 set -e # 配置变量 NEXTCLOUD_PATH="/var/www/nextcloud" DATA_PATH="/var/www/nextcloud/data" WEB_USER="www-data" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查 Nextcloud 安装 check_nextcloud() { if [ ! -d "$NEXTCLOUD_PATH" ]; then log_error "Nextcloud 未安装在 $NEXTCLOUD_PATH" log_info "请修改脚本中的 NEXTCLOUD_PATH 变量" exit 1 fi log_success "找到 Nextcloud 安装" } # 显示所有用户 list_users() { log_info "获取所有用户列表..." echo "" echo "=== 用户列表 ===" sudo -u $WEB_USER php $NEXTCLOUD_PATH/occ user:list echo "" } # 显示用户详细信息 show_user_info() { local username=$1 if [ -z "$username" ]; then log_error "请提供用户名" return 1 fi log_info "获取用户 $username 的详细信息..." echo "" echo "=== 用户 $username 信息 ===" sudo -u $WEB_USER php $NEXTCLOUD_PATH/occ user:info "$username" echo "" } # 显示用户文件统计 show_user_files() { local username=$1 if [ -z "$username" ]; then log_error "请提供用户名" return 1 fi local user_path="$DATA_PATH/$username/files" if [ ! -d "$user_path" ]; then log_error "用户 $username 的文件目录不存在" return 1 fi log_info "分析用户 $username 的文件..." echo "" echo "=== 用户 $username 文件统计 ===" echo "文件总数: $(find "$user_path" -type f | wc -l)" echo "目录总数: $(find "$user_path" -type d | wc -l)" echo "总大小: $(du -sh "$user_path" | cut -f1)" echo "" echo "=== 按文件类型统计 ===" find "$user_path" -type f -name ".*" -prune -o -type f -print | \ sed 's/.*\.//' | sort | uniq -c | sort -nr | head -10 echo "" echo "=== 最大的 10 个文件 ===" find "$user_path" -type f -exec ls -lh {} + | \ sort -k5 -hr | head -10 | awk '{print $5, $9}' echo "" } # 搜索文件 search_files() { local username=$1 local pattern=$2 if [ -z "$username" ] || [ -z "$pattern" ]; then log_error "请提供用户名和搜索模式" return 1 fi local user_path="$DATA_PATH/$username/files" if [ ! -d "$user_path" ]; then log_error "用户 $username 的文件目录不存在" return 1 fi log_info "在用户 $username 的文件中搜索: $pattern" echo "" echo "=== 搜索结果 ===" find "$user_path" -iname "*$pattern*" -type f | head -20 echo "" } # 显示存储使用情况 show_storage_usage() { log_info "分析存储使用情况..." echo "" echo "=== 存储使用统计 ===" # 总存储使用 total_size=$(du -sh "$DATA_PATH" | cut -f1) echo "总存储使用: $total_size" echo "" # 按用户统计 echo "=== 各用户存储使用 ===" for user_dir in "$DATA_PATH"/*; do if [ -d "$user_dir" ] && [ "$(basename "$user_dir")" != "appdata_oc" ]; then username=$(basename "$user_dir") user_size=$(du -sh "$user_dir" | cut -f1) file_count=$(find "$user_dir/files" -type f 2>/dev/null | wc -l) echo "$username: $user_size ($file_count 个文件)" fi done echo "" } # 清理用户文件 cleanup_user_files() { local username=$1 local pattern=$2 if [ -z "$username" ]; then log_error "请提供用户名" return 1 fi local user_path="$DATA_PATH/$username/files" if [ ! -d "$user_path" ]; then log_error "用户 $username 的文件目录不存在" return 1 fi log_warning "即将清理用户 $username 的文件" if [ -n "$pattern" ]; then log_warning "清理模式: $pattern" fi read -p "确认继续?(y/N): " confirm if [[ $confirm != [yY] ]]; then log_info "操作已取消" return 0 fi if [ -n "$pattern" ]; then find "$user_path" -iname "*$pattern*" -type f -delete log_success "已清理匹配 $pattern 的文件" else log_error "请提供清理模式" return 1 fi } # 显示帮助 show_help() { echo "Nextcloud 文件管理脚本" echo "" echo "用法: $0 [选项] [参数]" echo "" echo "选项:" echo " list-users 显示所有用户" echo " user-info <用户名> 显示用户详细信息" echo " user-files <用户名> 显示用户文件统计" echo " search <用户名> <模式> 搜索用户文件" echo " storage 显示存储使用情况" echo " cleanup <用户名> <模式> 清理用户文件(危险操作)" echo " help 显示此帮助信息" echo "" echo "示例:" echo " $0 list-users" echo " $0 user-info john" echo " $0 user-files john" echo " $0 search john *.pdf" echo " $0 storage" echo " $0 cleanup john *.tmp" } # 主函数 main() { case "$1" in "list-users") check_nextcloud list_users ;; "user-info") check_nextcloud show_user_info "$2" ;; "user-files") check_nextcloud show_user_files "$2" ;; "search") check_nextcloud search_files "$2" "$3" ;; "storage") check_nextcloud show_storage_usage ;; "cleanup") check_nextcloud cleanup_user_files "$2" "$3" ;; "help"|"--help"|"-h") show_help ;; *) log_error "未知选项: $1" show_help exit 1 ;; esac } # 运行主函数 main "$@"