[Share Experiences] 删除指定目录下的旧版deb包——由GPT4全部写成
Tofloor
poster avatar
神末shenmo
Moderator
Spark-App
2023-03-20 21:10
Author

我是一个蹩脚的coder,只会简单的bash

从ChatGPT开始,我就在尝试让它编码

最近的需求是星火仓库的审核程序不会处理旧版的软件包,导致旧版包越积越多

为了仓库瘦身,我们需要一个脚本来自动删除旧版的软件包

我将相关需求告知了GPT4,它直接给了我可以使用的脚本

人工智能确实大大提升了生产力,让我这样的蹩脚业余coder也可以轻松的实现各种功能

#!/usr/bin/env python3

import os
import subprocess
import sys

# 定义要搜索deb包的目录
DEB_DIR=sys.argv[1]
print(DEB_DIR)
# 定义一个字典来存储包名和版本号
packages = {}

# 循环遍历目录中的所有deb包
for root, dirs, files in os.walk(DEB_DIR):
    for file in files:
        if file.endswith(".deb"):
            deb_package = os.path.join(root, file)
            # 获取包名和版本号
            package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
            package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()

            # 检查包名是否已经存在于列表中
            if package_name in packages:
                # 如果包版本更高,则更新版本号
                if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                    packages[package_name] = package_version
            else:
                # 如果包名不存在,则将其添加到列表中
                packages[package_name] = package_version

# 循环遍历包列表并删除任何旧版本
for package_name in packages:
    for root, dirs, files in os.walk(DEB_DIR):
        for file in files:
            if file.startswith(package_name) and file.endswith(".deb"):
                deb_package = os.path.join(root, file)
                package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
                if package_version != packages[package_name]:
                    print(f"{package_name} {package_version} {deb_package} 已删除")
                    os.remove(deb_package)

Reply Favorite View the author
All Replies
1 / 2
To page
jjcui8595
Moderator
2023-03-20 21:42
#1

like

Reply View the author
fuuko
deepin
2023-03-20 21:47
#2

三层for循环瞩目

Reply View the author
BPU
deepin
2023-03-20 21:51
#3

如果 gpt 写出的代码,逻辑太深,我看不懂,会不会有潜在风险

比如,gpt 给我植入了一个 逻辑炸弹

Reply View the author
wlly-lzh
deepin
2023-03-20 22:00
#4

听说国内百度也搞了个类似的,好像叫什么“文心”什么的,大家有没有试过的来分享一下?

Reply View the author
ThinkYoung
deepin
2023-03-20 22:10
#5

😍

Reply View the author
神末shenmo
Moderator
Spark-App
2023-03-20 22:25
#6
BPU

如果 gpt 写出的代码,逻辑太深,我看不懂,会不会有潜在风险

比如,gpt 给我植入了一个 逻辑炸弹

让他写注释解释

Reply View the author
神末shenmo
Moderator
Spark-App
2023-03-20 22:25
#7
fuuko

三层for循环瞩目

应该怎样写比较好呢?

Reply View the author
青稚°
Moderator
2023-03-20 22:27
#8

like

Reply View the author
W2J
deepin
2023-03-20 22:59
#9

神末大神,这个脚本只保留一个最高版本,是不是太偏狭了。

不如把过时版本移至旧版本库去,而不是直接移除掉。

Reply View the author
berners
deepin
2023-03-21 00:03
#10
神末shenmo

让他写注释解释

GPT-4的chatgpt不是服务器过载上不去吗?你是用的收费版吗?

Reply View the author
希声
deepin
2023-03-21 01:05
#11

最近用了,感觉很多低级工作被替代了,工作效率也有极大打提升,最初出现打很可能的形式就是,一个人替换两个人

Reply View the author
enforcee
deepin
2023-03-21 01:49
#12

前面的包名是用遍历文件用dpkg获取的,但是后面的他直接用包名去区配文件了。如果有包的文件名和包名不一样的话就被忽略掉了。

blush

看样子还有些优化的空间

Reply View the author
uvz
deepin
2023-03-21 03:21
#13

优秀, 这个代码看着舒坦, 还自带注释

Reply View the author
神末shenmo
Moderator
Spark-App
2023-03-21 06:06
#14
enforcee

前面的包名是用遍历文件用dpkg获取的,但是后面的他直接用包名去区配文件了。如果有包的文件名和包名不一样的话就被忽略掉了。

blush

看样子还有些优化的空间

已经因为这个出事故了

deepin-wine和deepin-wine6-stable的前缀都是deepin-wine,末尾都是deb

结果在删除的时候认为这是同一个包了

我让他改,他改成这样了

#!/usr/bin/env python3

import os
import subprocess
import sys

# 定义要搜索deb包的目录
DEB_DIR=sys.argv[1]
print(DEB_DIR)
# 定义一个字典来存储包名和版本号
packages = {}

# 循环遍历目录中的所有deb包
for root, dirs, files in os.walk(DEB_DIR):
    for file in files:
        if file.endswith(".deb"):
            deb_package = os.path.join(root, file)
            # 获取包名和版本号
            package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
            package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
            # 检查包名是否已经存在于列表中
            if package_name in packages:
                # 如果包版本更高,则更新版本号
                if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                    packages[package_name] = package_version
            else:
                # 如果包名不存在,则将其添加到列表中
                packages[package_name] = package_version

# 循环遍历包列表并删除任何旧版本
for package_name in packages:
    for root, dirs, files in os.walk(DEB_DIR):
        for file in files:
            if file.endswith(".deb"):
                deb_package = os.path.join(root, file)
                # 获取包名和版本号
                package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
                package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
                # 检查包名是否已经存在于列表中
                if package_name in packages:
                    # 如果包版本更高,则更新版本号
                    if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                        packages[package_name] = package_version
                else:
                    # 如果包名不存在,则将其添加到列表中
                    packages[package_name] = package_version
                if package_version != packages[package_name]:
                    print(f"{package_name} {package_version} {deb_package} 已删除")
                    os.remove(deb_package)


让它精简了下

#!/usr/bin/env python3

import os
import subprocess
import sys

# 定义要搜索deb包的目录
DEB_DIR=sys.argv[1]
print(DEB_DIR)
# 定义一个字典来存储包名和版本号
packages = {}

# 循环遍历目录中的所有deb包
for root, dirs, files in os.walk(DEB_DIR):
    for file in files:
        if file.endswith(".deb"):
            deb_package = os.path.join(root, file)
            # 获取包名和版本号
            package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
            package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
            # 检查包名是否已经存在于列表中
            if package_name in packages:
                # 如果包版本更高,则更新版本号
                if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                    packages[package_name] = package_version
            else:
                # 如果包名不存在,则将其添加到列表中
                packages[package_name] = package_version
            if package_version != packages[package_name]:
                print(f"{package_name} {package_version} {deb_package} 已删除")
                os.remove(deb_package)

Reply View the author
enforcee
deepin
2023-03-21 06:09
#15
神末shenmo

已经因为这个出事故了

deepin-wine和deepin-wine6-stable的前缀都是deepin-wine,末尾都是deb

结果在删除的时候认为这是同一个包了

我让他改,他改成这样了

#!/usr/bin/env python3

import os
import subprocess
import sys

# 定义要搜索deb包的目录
DEB_DIR=sys.argv[1]
print(DEB_DIR)
# 定义一个字典来存储包名和版本号
packages = {}

# 循环遍历目录中的所有deb包
for root, dirs, files in os.walk(DEB_DIR):
    for file in files:
        if file.endswith(".deb"):
            deb_package = os.path.join(root, file)
            # 获取包名和版本号
            package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
            package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
            # 检查包名是否已经存在于列表中
            if package_name in packages:
                # 如果包版本更高,则更新版本号
                if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                    packages[package_name] = package_version
            else:
                # 如果包名不存在,则将其添加到列表中
                packages[package_name] = package_version

# 循环遍历包列表并删除任何旧版本
for package_name in packages:
    for root, dirs, files in os.walk(DEB_DIR):
        for file in files:
            if file.endswith(".deb"):
                deb_package = os.path.join(root, file)
                # 获取包名和版本号
                package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
                package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
                # 检查包名是否已经存在于列表中
                if package_name in packages:
                    # 如果包版本更高,则更新版本号
                    if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                        packages[package_name] = package_version
                else:
                    # 如果包名不存在,则将其添加到列表中
                    packages[package_name] = package_version
                if package_version != packages[package_name]:
                    print(f"{package_name} {package_version} {deb_package} 已删除")
                    os.remove(deb_package)


让它精简了下

#!/usr/bin/env python3

import os
import subprocess
import sys

# 定义要搜索deb包的目录
DEB_DIR=sys.argv[1]
print(DEB_DIR)
# 定义一个字典来存储包名和版本号
packages = {}

# 循环遍历目录中的所有deb包
for root, dirs, files in os.walk(DEB_DIR):
    for file in files:
        if file.endswith(".deb"):
            deb_package = os.path.join(root, file)
            # 获取包名和版本号
            package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
            package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
            # 检查包名是否已经存在于列表中
            if package_name in packages:
                # 如果包版本更高,则更新版本号
                if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                    packages[package_name] = package_version
            else:
                # 如果包名不存在,则将其添加到列表中
                packages[package_name] = package_version
            if package_version != packages[package_name]:
                print(f"{package_name} {package_version} {deb_package} 已删除")
                os.remove(deb_package)

这是我没想到的

shocked

我只觉得他会少删了包,没想到还多删了包

sad

还是需要谨慎一点

Reply View the author
enforcee
deepin
2023-03-21 06:25
#16

新的代码似乎能完成任务,不过粗略看一下,我觉得后面的「检查包名是否已经存在于列表中」整个if-else应该是没有用的,最外层的那个 for package_name in packages:应该也是不需要的。

yeah

精简后的那个代码应该是没用的,会漏删遍历顺序在先的低版本包

Reply View the author
神末shenmo
Moderator
Spark-App
2023-03-21 06:35
#17
enforcee

新的代码似乎能完成任务,不过粗略看一下,我觉得后面的「检查包名是否已经存在于列表中」整个if-else应该是没有用的,最外层的那个 for package_name in packages:应该也是不需要的。

yeah

精简后的那个代码应该是没用的,会漏删遍历顺序在先的低版本包

手动改了下,这回应该是可以了吧

#!/usr/bin/env python3

import os
import subprocess
import sys

# 定义要搜索deb包的目录
DEB_DIR=sys.argv[1]
print(DEB_DIR)
# 定义一个字典来存储包名和版本号
packages = {}

# 循环遍历目录中的所有deb包
for root, dirs, files in os.walk(DEB_DIR):
    for file in files:
        if file.endswith(".deb"):
            deb_package = os.path.join(root, file)
            # 获取包名和版本号
            package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
            package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
            # 检查包名是否已经存在于列表中
            if package_name in packages:
                # 如果包版本更高,则更新版本号
                if subprocess.call(["dpkg", "--compare-versions", package_version, "gt", packages[package_name]]) == 0:
                    packages[package_name] = package_version
            else:
                # 如果包名不存在,则将其添加到列表中
                packages[package_name] = package_version

# 循环遍历包列表并删除任何旧版本
for package_name in packages:
    for root, dirs, files in os.walk(DEB_DIR):
        for file in files:
            if file.endswith(".deb"):
                deb_package = os.path.join(root, file)
                # 获取包名和版本号
                package_name = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Package"]).decode().strip()
                package_version = subprocess.check_output(["dpkg-deb", "-f", deb_package, "Version"]).decode().strip()
                if package_version != packages[package_name]:
                    print(f"{package_name} {package_version} {deb_package} 已删除")
                    os.remove(deb_package)


Reply View the author
神末shenmo
Moderator
Spark-App
2023-03-21 06:38
#18
enforcee

这是我没想到的

shocked

我只觉得他会少删了包,没想到还多删了包

sad

还是需要谨慎一点

也有少删了的,有些新投稿上线之前的古早包没被删

一些手动上传的不规范包也是

Reply View the author
enforcee
deepin
2023-03-21 06:48
#19

也不知道神末有没有能供测试的文件了

sweat

其实无论是我还是GPT,都是纸上谈兵,到底能不能行还是要看实战。

我在想,GPT每次给别人回答都是义正辞严的样子,但是说得对不对很难一眼看出来,有些时候根本就是用肯定的语气说错误的话。有没有一种方法能知道他对他的回答有多大程度的把握呢?

Reply View the author
神末shenmo
Moderator
Spark-App
2023-03-21 06:57
#20
enforcee

也不知道神末有没有能供测试的文件了

sweat

其实无论是我还是GPT,都是纸上谈兵,到底能不能行还是要看实战。

我在想,GPT每次给别人回答都是义正辞严的样子,但是说得对不对很难一眼看出来,有些时候根本就是用肯定的语气说错误的话。有没有一种方法能知道他对他的回答有多大程度的把握呢?

我都有备份的,问题不大

现在好像这个东西会跑到天长地久,很奇怪

Reply View the author
1 / 2
To page