安全删除已解压文件的 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. 检查是否有重要文件被意外删除"