-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrestore.sh
executable file
·129 lines (115 loc) · 3.79 KB
/
restore.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/bash
# 定义目录变量
SOURCE_DIR="linux-0.11"
BACKUP_DIR="linux-0.11-back"
MODIFIED_DIR="modified-files"
# 忽略的正则表达式数组
IGNORE_PATTERNS=(
'^\.(git|hg|svn)$' # 忽略版本控制目录
'.*\.o$' # 忽略编译生成的目标文件
'.*\.a$' # 忽略编译生成的静态库文件
'System.map' # 忽略 System.map 文件
'bootsect' # 忽略 bootsect 文件
'setup' # 忽略 setup 文件
'keyboard.*\.s' # 忽略键盘相关汇编文件
'Image' # 忽略 Image 文件
'tool' # 忽略 tool 目录
)
# 解析参数
COPY_MODIFIED=false
RESTORE_ORIGINAL=false
COPY_MODIFIED_TO_SOURCE=false # [新增] 标记是否将修改后的文件复制回 SOURCE_DIR
while getopts "crb" opt; do # [修改] 增加 b 参数
case $opt in
c)
COPY_MODIFIED=true
;;
r)
RESTORE_ORIGINAL=true
;;
b)
COPY_MODIFIED_TO_SOURCE=true # [新增] 处理 b 参数
;;
*)
echo "Usage: $0 [-c] [-r] [-b]"
echo " -c Copy modified files to target directory"
echo " -r Restore original files from backup"
echo " -b Copy modified files back to source directory"
exit 1
;;
esac
done
# 检查参数冲突
if $COPY_MODIFIED && $COPY_MODIFIED_TO_SOURCE; then # [新增] 参数冲突检查
echo "Error: -c and -b options cannot be used together."
exit 1
fi
# 创建存放修改过文件的目标目录(如果需要复制)
if $COPY_MODIFIED; then
mkdir -p "$MODIFIED_DIR"
fi
# 检查文件是否应被忽略
should_ignore() { # [新增] 检查文件是否应被忽略的函数
local file=$1
for pattern in "${IGNORE_PATTERNS[@]}"; do # [新增] 循环遍历忽略模式
if [[ $file =~ $pattern ]]; then
# 打印被忽略的文件名
echo "Ignored: $file"
return 0
fi
done
return 1
}
# 遍历原始目录中的文件
find "$SOURCE_DIR" -type f | while read -r FILE; do
# 获取相对于原始目录的相对路径
REL_PATH="${FILE#$SOURCE_DIR/}"
# 检查文件是否应被忽略
if should_ignore "$REL_PATH"; then # [新增] 调用 should_ignore 函数检查文件是否应被忽略
continue
fi
# 获取相应的备份文件路径
BACKUP_FILE="$BACKUP_DIR/$REL_PATH"
# 检查备份文件是否存在
if [ -e "$BACKUP_FILE" ]; then
# 检查文件是否被修改
if ! cmp -s "$FILE" "$BACKUP_FILE"; then
echo "Modified: $REL_PATH"
if $COPY_MODIFIED; then
# 文件被修改,复制到目标目录
mkdir -p "$MODIFIED_DIR/$(dirname "$REL_PATH")"
cp "$FILE" "$MODIFIED_DIR/$REL_PATH"
fi
if $RESTORE_ORIGINAL; then
# 恢复原文件
cp "$BACKUP_FILE" "$FILE"
fi
fi
else
# 将新增文件复制到目标目录
if $COPY_MODIFIED; then
mkdir -p "$MODIFIED_DIR/$(dirname "$REL_PATH")"
cp "$FILE" "$MODIFIED_DIR/$REL_PATH"
fi
if $RESTORE_ORIGINAL; then
# 删除原文件
rm -f "$FILE"
fi
fi
done
# [新增] 将 MODIFIED_DIR 中的文件复制回 SOURCE_DIR
if $COPY_MODIFIED_TO_SOURCE; then
find "$MODIFIED_DIR" -type f | while read -r FILE; do
REL_PATH="${FILE#$MODIFIED_DIR/}"
mkdir -p "$SOURCE_DIR/$(dirname "$REL_PATH")"
cp "$FILE" "$SOURCE_DIR/$REL_PATH"
done
echo "修改后的文件已复制回源目录 $SOURCE_DIR。"
fi
echo "脚本执行完毕。"
if $COPY_MODIFIED; then
echo "修改过的文件已复制到 $MODIFIED_DIR。"
fi
if $RESTORE_ORIGINAL; then
echo "原文件已恢复到初始状态。"
fi