-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapt_move_Before.sh
213 lines (184 loc) · 7.58 KB
/
apt_move_Before.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#!/bin/bash
# 【apt-move 预处理】
# 查询已安装的deb包,并缓存包到 /var/cache/apt/archives,如果不存在的话
# grep -v : 排除指定的字符串
# if -z : 字符串长度为0返回 true
# if -n : 字符串长度不为0返回 true
# if -e : 检测文件(包括目录)是否存在,如果是,则返回 true。
# if -f : 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
# ==================================================
# 函数名称: FixFileName
# 函数功能: 修复文件名
# 函数参数:
# $1: 工作路径
# [$2]:
# 将会复制 .deb 到 /var/cache/apt/archives
# ==================================================
function FixFileName(){
local Fix_OldCD="`pwd`"
local Fix_WorkDir="${1}"
cd "${Fix_WorkDir}"
# Fix:修复文件名
# 注意,有些软件包信息如下
# gawk/stable,now 1:5.2.1-2 amd64
# 下载后,1: 会编码为 1%3a
# gawk_1%3a5.2.1-2_amd64.deb
# 这和源文件名称不同,需要处理。
#
# 遍历当前目录下的所有 .deb 文件
for file in *.deb; do
# 去除 1%3a
new_file=$(echo "$file" | sed -E 's/_[^_]*%3a/_/')
# 如果新文件名与旧文件名不同,则进行重命名
if [[ "$file" != "$new_file" ]]; then
mv -f "$file" "$new_file"
echo "$file => $new_file"
fi
# 复制文件
if [ -f "$new_file" ];then
if [ ! -f "/var/cache/apt/archives/$new_file" ];then
mv -f "$new_file" "/var/cache/apt/archives/"
else
rm -f "$new_file"
fi
fi
done
cd "${Fix_OldCD}"
}
##### 函数测试 #####
# FixFileName "/tmp/34343/"
# apt list --installed
# Listing...
# zstd/stable,now 1.5.4+dfsg2-5 amd64 [installed]
# apt-cache show PackageName 显示信息包含如下:
# Package: bc
# Version: 1.07.1-3+b1
# Architecture: amd64
# Filename: pool/main/b/bc/bc_1.07.1-3+b1_amd64.deb
# 列出所有已安装的包
# zstd/stable,now/1.5.4+dfsg2-5/amd64
INSTALLED_PACKAGES=$(apt list --installed | grep -v "Listing..." | awk '{print $1 "/" $2 "/" $3}')
# INSTALLED_PACKAGES=$(apt list --installed | grep -v "Listing..." | head -n 5 | awk '{print $1 "/" $2 "/" $3}')
OldCD="`pwd`"
# 临时目录
TMPDIR="/tmp/apt_cache_prv"
mkdir -p "${TMPDIR}" 2>/dev/null
# 待下载的包
#TMPFILE_Package="${TMPDIR}/ARR_Package.sh"
# 下载失败的包
TMPFILE_PackageNoDown="${TMPDIR}/ARR_PackageNoDown.sh"
# APT缓存路径
APT_CachePath="/var/cache/apt/archives"
# 遍历每个已安装的包
i=1
Count1=0
for PACKAGE_WITH_VERSION in $INSTALLED_PACKAGES; do
# 包名(zstd)
PACKAGE_NAME=$(echo "$PACKAGE_WITH_VERSION" | awk -F "/" '{print $1}')
# 包版本(1.5.4+dfsg2-5)
PACKAGE_VERSION=$(echo "$PACKAGE_WITH_VERSION" | awk -F "/" '{print $3}')
# 包架构(amd64)
PACKAGE_ARCH=$(echo "$PACKAGE_WITH_VERSION" | awk -F "/" '{print $4}')
# 包信息
PACKAGE_INFO=$(apt-cache show $PACKAGE_NAME 2>/dev/null)
# 检查是否成功获取了包信息
if [ -z "$PACKAGE_INFO" ]; then
echo "Failed to retrieve information for package $PACKAGE_NAME"
continue
fi
# 包文件名
# 从包信息中提取 .deb 文件名
# Filename: pool/main/b/bc/bc_1.07.1-3+b1_amd64.deb =>
# pool/main/b/bc/bc_1.07.1-3+b1_amd64.deb
DEB_FILEPATH=$(echo "$PACKAGE_INFO" | grep 'Filename:'| grep "${PACKAGE_ARCH}" | head -n 1 | awk '{print $2}')
# bc_1.07.1-3+b1_amd64.deb
DEB_FILENAME="${DEB_FILEPATH##*/}"
# 生成待下载的包的相关信息
# 在 ${APT_CachePath} 下不存在包时
if [ -n "$DEB_FILENAME" ]; then
# 包文件名 不为空时...
if [ ! -f "${APT_CachePath}/${DEB_FILENAME}" ]; then
# 文件不存在时...
# Package: apt-move
# Version: 4.2.27-6
# Architecture: amd64
# Filename: apt-move_4.2.27-6_amd64.deb
# echo "Package: ${PACKAGE_NAME}"
# echo "Version: ${PACKAGE_VERSION}"
# echo "Architecture: ${PACKAGE_ARCH}"
# echo "Filename: ${DEB_FILENAME}"
ARR_Package_Name[${i}]="${PACKAGE_NAME}"
ARR_Package_Version[${i}]="${PACKAGE_VERSION}"
ARR_Package_Architecture[${i}]="${PACKAGE_ARCH}"
ARR_Package_FileName[${i}]="${DEB_FILENAME}"
Count1=${i}
let i++
fi
fi
done
# 下载软件包
Tmp_DownPath="/tmp/APTDOWN_`date +%s`"
mkdir -p "${Tmp_DownPath}"
cd ${Tmp_DownPath}
i=1
Count2=0
for key in ${!ARR_Package_Name[@]};do
if [ ! -f "${APT_CachePath}/${ARR_Package_FileName[$key]}" ]; then
# 文件不存在时,下载
# 下载包: 1次尝试
echo -e "\033[1;37m[Down:1] ${ARR_Package_Name[$key]} : ${ARR_Package_FileName[$key]} ...\033[0m"
apt-get download ${ARR_Package_Name[$key]}
FixFileName "${Tmp_DownPath}"
if [ ! -f "${APT_CachePath}/${ARR_Package_FileName[$key]}" ]; then
# 下载包: 2次尝试
echo -e "\033[1;37m[Down:2] ${ARR_Package_Name[$key]} : ${ARR_Package_FileName[$key]} ...\033[0m"
apt-get download ${ARR_Package_Name[$key]}
FixFileName "${Tmp_DownPath}"
if [ ! -f "${APT_CachePath}/${ARR_Package_FileName[$key]}" ]; then
# 文件不存在时...
ARR_PackageNoDown_Name[${i}]="${ARR_Package_Name[$key]}"
ARR_PackageNoDown_Version[${i}]="${ARR_Package_Version[$key]}"
ARR_PackageNoDown_Architecture[${i}]="${ARR_Package_Architecture[$key]}"
ARR_PackageNoDown_FileName[${i}]="${ARR_Package_FileName[$key]}"
Count2=${i}
let i++
# 失败
echo -e "\033[1;31m[Down:2] ${ARR_Package_Name[$key]} : ${ARR_Package_FileName[$key]}\033[0m"
else
# 成功
echo -e "\033[1;32m[Down:2] ${ARR_Package_Name[$key]} : ${ARR_Package_FileName[$key]}\033[0m"
fi
else
# 成功
echo -e "\033[1;32m[Down:1] ${ARR_Package_Name[$key]} : ${ARR_Package_FileName[$key]}\033[0m"
fi
fi
echo
done
# 下载结果反馈
# -gt > | -lt < | -eq = | -ne != | -ge >= | -le <=
if [ ${Count2} -gt 0 ]; then
echo "#!/bin/bash">"${TMPFILE_PackageNoDown}"
fi
echo ""
for key in ${!ARR_PackageNoDown_Name[@]};do
# 持久化 下载失败 的数据
echo -e "\033[1;31m[DownError] ${ARR_PackageNoDown_Name[$key]} : ${ARR_PackageNoDown_FileName[$key]}\033[0m"
echo "ARR_PackageNoDown_Name[$key]=\"${ARR_PackageNoDown_Name[$key]}\"">>"${TMPFILE_PackageNoDown}"
echo "ARR_PackageNoDown_Version[$key]=\"${ARR_PackageNoDown_Version[$key]}\"">>"${TMPFILE_PackageNoDown}"
echo "ARR_PackageNoDown_Architecture[$key]=\"${ARR_PackageNoDown_Architecture[$key]}\"">>"${TMPFILE_PackageNoDown}"
echo "ARR_PackageNoDown_FileName[$key]=\"${ARR_PackageNoDown_FileName[$key]}\"">>"${TMPFILE_PackageNoDown}"
done
if [ ${Count2} -gt 0 ]; then
echo "[Out] ${TMPFILE_PackageNoDown}"
echo "[Use] source ${TMPFILE_PackageNoDown}"
fi
echo ""
Count3=0
Count3=$((${Count1}-${Count2}))
echo -e "\033[1;37m下载数量:\033[0m \033[1;33m${Count1}\033[0m \033[1;37m下载失败:\033[0m \033[1;31m${Count2}\033[0m \033[1;37m下载成功:\033[0m \033[1;32m${Count3}\033[0m"
cd ${OldCD}
# 允许组用户和其他用户读和执行
# Fix:
# W: Download is performed unsandboxed as root as file '/....deb' couldn't be accessed by user '_apt'.
chmod -R 755 "${APT_CachePath}"