安全删除已解压文件的 Shell 脚本

嗯,没错,HI 过头了,把一个有上万文件的包解压到了一个已经有文件的目录,时间戳、文件名都无法区分,牙疼~

对了,忘记说了,绝对不是我干的!在他吭哧吭哧删文件的时候,我使出洪荒之力,肝了个脚本:用于删除从 tar 压缩包解压到现有目录中的文件,同时保留原有文件。

注意事项

  • 备份重要数据​​:在执行删除操作前,请确保已备份重要文件
  • 权限要求​​:脚本需要读取 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. 检查是否有重要文件被意外删除"
文章作者: 若海; 原文链接: https://www.rehiy.com/post/605/; 转载需声明来自若海观澜

添加新评论