自动将当前路径下tar.gz解压并且将里面的内容移动到对应位置
将脚本当前目录(包括子目录)类的压缩包解压,将qcow2及父目录传输到qemu目录,将yml传输到模板目录,将png传输到图标目录,将py传输到scripts目录,将bin传输到iol/l2或l3目录。
由于iol/l2以及iol/l3目录未正式使用,所以如果自动移动到这2个目录,需要手动移动回去。
#!/bin/bash
# 颜色定义
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 目标路径定义
QCOW2_PATH="/opt/unetlab/addons/qemu"
YML_INTEL_PATH="/opt/unetlab/html/templates/intel"
YML_AMD_PATH="/opt/unetlab/html/templates/amd"
PNG_PATH="/opt/unetlab/html/images/icons"
BIN_BASE_PATH="/opt/unetlab/addons/iol/bin"
BIN_L2_PATH="/opt/unetlab/addons/iol/bin/l2"
BIN_L3_PATH="/opt/unetlab/addons/iol/bin/l3"
PY_PATH="/opt/unetlab/config_scripts"
# 日志函数
log_info() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M')] [信息] $1${NC}"
}
log_warn() {
echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M')] [警告] $1${NC}"
}
log_error() {
echo -e "${RED}[$(date '+%Y-%m-%d %H:%M')] [错误] $1${NC}"
}
# 创建目标目录函数
create_target_dirs() {
local dirs=("$QCOW2_PATH" "$YML_INTEL_PATH" "$YML_AMD_PATH" "$PNG_PATH" "$BIN_BASE_PATH" "$BIN_L2_PATH" "$BIN_L3_PATH" "$PY_PATH")
for dir in "${dirs[@]}"; do
if [ ! -d "$dir" ]; then
mkdir -p "$dir"
if [ $? -eq 0 ]; then
log_info "创建目录: $dir"
else
log_error "无法创建目录: $dir"
fi
fi
done
}
# 解压函数
extract_archives() {
local script_dir=$(dirname "$(realpath "$0")")
local extracted_count=0
# 查找所有压缩文件
while IFS= read -r -d '' file; do
local filename=$(basename "$file")
local dirname=$(dirname "$file")
case "$filename" in
*.zip)
unzip -q -o "$file" -d "$dirname"
if [ $? -eq 0 ]; then
log_info "解压 $filename 完成"
((extracted_count++))
else
log_error "解压 $filename 失败"
fi
;;
*.tar.gz|*.tgz)
tar -xzf "$file" -C "$dirname"
if [ $? -eq 0 ]; then
log_info "解压 $filename 完成"
((extracted_count++))
else
log_error "解压 $filename 失败"
fi
;;
*.tar.bz2|*.tbz2)
tar -xjf "$file" -C "$dirname"
if [ $? -eq 0 ]; then
log_info "解压 $filename 完成"
((extracted_count++))
else
log_error "解压 $filename 失败"
fi
;;
*.tar.xz|*.txz)
tar -xJf "$file" -C "$dirname"
if [ $? -eq 0 ]; then
log_info "解压 $filename 完成"
((extracted_count++))
else
log_error "解压 $filename 失败"
fi
;;
*.tar)
tar -xf "$file" -C "$dirname"
if [ $? -eq 0 ]; then
log_info "解压 $filename 完成"
((extracted_count++))
else
log_error "解压 $filename 失败"
fi
;;
*.gz)
if [[ "$filename" != *.tar.gz ]]; then
gunzip -f "$file"
if [ $? -eq 0 ]; then
log_info "解压 $filename 完成"
((extracted_count++))
else
log_error "解压 $filename 失败"
fi
fi
;;
esac
done < <(find "$script_dir" -type f \( -name "*.zip" -o -name "*.tar.gz" -o -name "*.tgz" -o -name "*.tar.bz2" -o -name "*.tbz2" -o -name "*.tar.xz" -o -name "*.txz" -o -name "*.tar" -o -name "*.gz" \) -print0)
if [ $extracted_count -gt 0 ]; then
log_info "总共解压了 $extracted_count 个压缩文件"
fi
}
# 文件统计和移动函数
process_files() {
local script_dir=$(dirname "$(realpath "$0")")
local qcow2_count=0 yml_count=0 png_count=0 bin_count=0 py_count=0
# 统计文件数量
while IFS= read -r -d '' file; do
local ext="${file##*.}"
case "$ext" in
qcow2) ((qcow2_count++)) ;;
yml|yaml) ((yml_count++)) ;;
png) ((png_count++)) ;;
bin) ((bin_count++)) ;;
py) ((py_count++)) ;;
esac
done < <(find "$script_dir" -type f \( -name "*.qcow2" -o -name "*.yml" -o -name "*.yaml" -o -name "*.png" -o -name "*.bin" -o -name "*.py" \) -print0)
log_info "检测到 $qcow2_count 个qcow2、$yml_count 个yml、$png_count 个png、$bin_count 个bin、$py_count 个py文件"
# 处理qcow2文件 - 修复后的逻辑
while IFS= read -r -d '' file; do
local dirname=$(dirname "$file")
local parent_dir=$(basename "$dirname")
local filename=$(basename "$file")
# 修复:检查是否在脚本所在目录的直接子文件夹中
if [ "$dirname" != "$script_dir" ]; then
# 移动整个包含qcow2文件的文件夹
local target_dir="$QCOW2_PATH/$parent_dir"
mkdir -p "$target_dir"
# 移动整个目录,而不仅仅是单个文件
if [ -d "$dirname" ]; then
cp -r "$dirname" "$QCOW2_PATH/"
if [ $? -eq 0 ]; then
log_info "移动 $parent_dir 镜像目录到 $QCOW2_PATH 成功!"
# 可选:删除原目录
# rm -rf "$dirname"
else
log_error "移动 $parent_dir 镜像目录失败"
fi
else
# 如果目录不存在,只移动文件
mv "$file" "$target_dir/"
if [ $? -eq 0 ]; then
log_info "移动 $filename 镜像到 $target_dir 成功!"
else
log_error "移动 $filename 镜像失败"
fi
fi
else
log_warn "检测到 $filename 文件没有上一级目录,该文件忽略。"
fi
done < <(find "$script_dir" -type f -name "*.qcow2" -print0)
# 处理yml文件
while IFS= read -r -d '' file; do
local dirname=$(dirname "$file")
local parent_dir=$(basename "$dirname")
local filename=$(basename "$file")
case "$parent_dir" in
intel|amd)
# 有明确的父目录
if [ "$parent_dir" = "intel" ]; then
mv "$file" "$YML_INTEL_PATH/"
log_info "移动 $filename 模板到 $YML_INTEL_PATH 成功!"
else
mv "$file" "$YML_AMD_PATH/"
log_info "移动 $filename 模板到 $YML_AMD_PATH 成功!"
fi
;;
*)
# 没有明确的父目录,复制到两个路径
cp "$file" "$YML_INTEL_PATH/"
cp "$file" "$YML_AMD_PATH/"
log_info "复制 $filename 模板到 Intel 和 AMD 模板目录成功!"
;;
esac
done < <(find "$script_dir" -type f \( -name "*.yml" -o -name "*.yaml" \) -print0)
# 处理png文件
while IFS= read -r -d '' file; do
local filename=$(basename "$file")
mv "$file" "$PNG_PATH/"
if [ $? -eq 0 ]; then
log_info "移动 $filename 图标到 $PNG_PATH 成功!"
else
log_error "移动 $filename 图标失败"
fi
done < <(find "$script_dir" -type f -name "*.png" -print0)
# 处理bin文件
while IFS= read -r -d '' file; do
local dirname=$(dirname "$file")
local parent_dir=$(basename "$dirname")
local filename=$(basename "$file")
case "$parent_dir" in
l2|l3)
# 有明确的父目录
if [ "$parent_dir" = "l2" ]; then
mkdir -p "$BIN_L2_PATH"
mv "$file" "$BIN_L2_PATH/"
log_info "移动 $filename 镜像到 $BIN_L2_PATH 成功!"
else
mkdir -p "$BIN_L3_PATH"
mv "$file" "$BIN_L3_PATH/"
log_info "移动 $filename 镜像到 $BIN_L3_PATH 成功!"
fi
;;
*)
# 检查文件名包含l2或l3关键字
if [[ "$filename" == *l2* ]]; then
if [ -d "$BIN_L2_PATH" ]; then
mv "$file" "$BIN_L2_PATH/"
log_info "移动 $filename 镜像到 $BIN_L2_PATH 成功!"
else
mv "$file" "$BIN_BASE_PATH/"
log_info "移动 $filename 镜像到 $BIN_BASE_PATH 成功!"
fi
elif [[ "$filename" == *l3* ]]; then
if [ -d "$BIN_L3_PATH" ]; then
mv "$file" "$BIN_L3_PATH/"
log_info "移动 $filename 镜像到 $BIN_L3_PATH 成功!"
else
mv "$file" "$BIN_BASE_PATH/"
log_info "移动 $filename 镜像到 $BIN_BASE_PATH 成功!"
fi
else
mv "$file" "$BIN_BASE_PATH/"
log_info "移动 $filename 镜像到 $BIN_BASE_PATH 成功!"
fi
;;
esac
done < <(find "$script_dir" -type f -name "*.bin" -print0)
# 处理py文件
while IFS= read -r -d '' file; do
local filename=$(basename "$file")
mv "$file" "$PY_PATH/"
if [ $? -eq 0 ]; then
log_info "移动 $filename 脚本到 $PY_PATH 成功!"
else
log_error "移动 $filename 脚本失败"
fi
done < <(find "$script_dir" -type f -name "*.py" -print0)
}
# 主函数
main() {
log_info "开始执行文件处理脚本"
# 创建目标目录
create_target_dirs
# 解压压缩包
extract_archives
# 处理各类文件
process_files
log_info "文件处理完成"
}
# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; then
log_warn "建议以root权限运行此脚本,否则可能无法访问目标目录"
read -p "是否继续? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
# 执行主函数
main