#!/bin/bash # patch_fnc.sh - 企业级增量补丁包生成脚本公共函数 # 用于并行查找,提供给xargs使用 # 文件工具函数 parse_size() { local size_str="$1" local unit=$(echo "$size_str" | sed 's/[0-9.]//g' | tr 'a-z' 'A-Z') local value=$(echo "$size_str" | sed 's/[^0-9.]//g') case "$unit" in "KB") echo "$(echo "$value * 1024" | bc)" ;; "MB") echo "$(echo "$value * 1024 * 1024" | bc)" ;; "GB") echo "$(echo "$value * 1024 * 1024 * 1024" | bc)" ;; *) echo "$value" ;; esac } get_file_hash() { local file_path="$1" local algorithm="${2:-sha256}" case "$algorithm" in "md5") md5sum "$file_path" | cut -d' ' -f1 ;; "sha1") sha1sum "$file_path" | cut -d' ' -f1 ;; "sha256") sha256sum "$file_path" | cut -d' ' -f1 ;; *) sha256sum "$file_path" | cut -d' ' -f1 ;; esac } get_file_info() { local file_path="$1" if [[ ! -f "$file_path" ]]; then error "文件不存在: $file_path" return 1 fi local stat_output if stat --version 2>&1 | grep -q GNU; then # GNU stat stat_output=$(stat -c "%s|%Y|%Z|%a|%u|%g" "$file_path") else # BSD stat stat_output=$(stat -f "%z|%m|%c|%p|%u|%g" "$file_path") fi echo "$stat_output" } # 文件筛选 should_include_file() { local file_path="$1" local file_info="$2" IFS='|' read -r size mtime ctime permissions uid gid <<< "$file_info" # 文件大小过滤 local max_size=$(parse_size "$MAX_FILE_SIZE") local min_size=$(parse_size "$MIN_FILE_SIZE") if [[ $size -gt $max_size ]] || [[ $size -lt $min_size ]]; then warn "文件大小超出范围: $file_path ($size bytes, 限制:$min_size-$max_size bytes)" return 1 fi # 包含模式匹配 local include_match=false for pattern in "${INCLUDE_PATTERNS[@]}"; do if [[ "$file_path" == $pattern ]] || [[ "$file_path" =~ $pattern ]]; then include_match=true debug "文件匹配包含模式<$pattern>: $file_path" break fi done if [[ ${#INCLUDE_PATTERNS[@]} -gt 0 ]] && ! $include_match; then warn "文件不匹配任何包含模式: $file_path" return 1 fi # 排除模式匹配 for pattern in "${EXCLUDE_PATTERNS[@]}"; do if [[ "$file_path" == $pattern ]] || [[ "$file_path" =~ $pattern ]]; then warn "文件匹配排除模式<$pattern>: $file_path" return 1 fi done # 时间过滤 if [[ -n "$MODIFIED_AFTER" ]]; then local filter_time=$(date -d "$MODIFIED_AFTER" +%s 2>/dev/null || date +%s) if [[ $mtime -lt $filter_time ]]; then local mtime_str=$(date -d @$mtime +"%Y-%m-%d %H:%M:%S") warn "文件修改时间过早: $file_path ($mtime_str)" return 1 fi fi # 权限过滤 if [[ "$PERMISSIONS_FILTER" == "true" ]]; then if [[ $permissions -ne 644 ]] && [[ $permissions -ne 755 ]]; then warn "文件权限不符合要求: $file_path ($permissions)" return 1 fi fi # 用户过滤 if [[ "$UID_FILTER" == "true" ]]; then if [[ $uid -ne 0 ]] && [[ $uid -ne 1000 ]]; then warn "文件所有者不符合要求: $file_path ($uid)" return 1 fi fi # 组过滤 if [[ "$GID_FILTER" == "true" ]]; then if [[ $gid -ne 0 ]] && [[ $gid -ne 1000 ]]; then warn "文件组不符合要求: $file_path ($gid)" return 1 fi fi return 0 }