背景故事
🚨 紧急救援场景:某位小伙伴(绝对不是我自己!)在嗨过头的情况下,不小心将一个包含上万文件的 tar 压缩包解压到了一个已有重要文件的目录中。新旧文件混杂在一起,时间戳、文件名都无法简单区分,简直让人头疼不已!
💪 英雄时刻:就在他吭哧吭哧手动删文件的时候,我使出洪荒之力,火速肝出了这个救命脚本!
注意事项
- 备份重要数据:在执行删除操作前,请确保已备份重要文件
- 权限要求:脚本需要读取 tar 文件和删除文件的权限
- 符号链接:脚本会删除符号链接本身,但不会追踪链接指向的文件
- 大文件处理:对于包含大量文件的 tar 包,处理可能需要较长时间
- 如果原文件和解压的文件名相同,那你自求多福吧
完整脚本代码
#!/bin/bash
# 安全删除已解压文件的脚本
# 用法: ./delete_extracted.sh <tar_file>
if [ $# -eq 0 ]; then
echo "错误:请提供 tar 文件名作为参数"
echo "用法: $0 <tar_file>"
exit 1
fi
TAR_FILE="$1"
# 检查 tar 文件是否存在
if [ ! -f "$TAR_FILE" ]; then
echo "错误:文件 '$TAR_FILE' 不存在"
exit 1
fi
# 创建临时目录用于存放文件列表
TMP_DIR=$(mktemp -d)
EXTRACTED_LIST="$TMP_DIR/extracted_files.txt"
echo "正在分析 tar 文件内容..."
tar -tf "$TAR_FILE" > "$EXTRACTED_LIST"
if [ $? -ne 0 ]; then
echo "错误:无法读取 tar 文件内容"
rm -rf "$TMP_DIR"
exit 1
fi
echo "找到 $(wc -l < "$EXTRACTED_LIST") 个文件/目录"
# 安全删除过程
COUNT=0
SKIPPED=0
DELETED_DIRS=0
while IFS= read -r path; do
# 跳过目录标记(目录会在文件删除后处理)
if [ "${path: -1}" = "/" ]; then
continue
fi
# 检查文件是否存在
if [ -e "$path" ]; then
# 安全删除文件
rm -v "$path"
if [ $? -eq 0 ]; then
((COUNT++))
else
echo "警告:无法删除 '$path'"
((SKIPPED++))
fi
else
echo "提示:'$path' 不存在(可能已被删除)"
((SKIPPED++))
fi
done < "$EXTRACTED_LIST"
# 删除空目录(从最深层次开始)
echo "清理空目录..."
sort -r "$EXTRACTED_LIST" | grep '/$' | while IFS= read -r dir; do
# 移除末尾的斜杠
clean_dir="${dir%/}"
if [ -d "$clean_dir" ]; then
# 尝试删除目录(仅当为空时)
rmdir "$clean_dir" 2>/dev/null
if [ $? -eq 0 ]; then
echo "删除空目录: $clean_dir"
((DELETED_DIRS++))
fi
fi
done
# 清理临时文件
rm -rf "$TMP_DIR"
echo "操作完成:"
echo " - 成功删除 $COUNT 个文件"
echo " - 跳过 $SKIPPED 个项目"
echo " - 清理 $DELETED_DIRS 个空目录"
echo ""
echo "重要提示:"
echo "1. 此操作不可逆,请确认删除的文件正确"
echo "2. 检查是否有重要文件被意外删除"
此脚本提供了一种安全的方式来删除从 tar 压缩包解压的文件,同时最大限度地减少对原有文件的影响。
评论列表 (0条):
加载更多评论 Loading...