不小心運行“apt install *”,現在所有軟體包都被標記為“手動安裝”

不小心運行“apt install *”,現在所有軟體包都被標記為“手動安裝”

一不小心就跑apt install '*'了雖然由於衝突(例如多個版本的vim編輯器),它沒有安裝任何東西,但所有安裝的軟體包都失去了它們的「自動」屬性,這意味著我無法再享受 APT 的自動依賴性檢查。也就是說,如果我刪除vim, apt 不再提示我刪除vim-runtime。我使用的是高級打包工具的精簡版本,因此apt-mark不可用。如何automatic為他人撫養的人恢復財產?

注意:我有aptapt-getapt-cacheapt-configapt-key可用。

答案1

在 Debian 及其衍生版本上,有關手動安裝與自動安裝的資訊儲存在/var/lib/apt/extended_states.沒有自動備份,也沒有日誌。如果您有該檔案的備份,請將其還原。

如果您沒有備份,請先製作一個備份,以防萬一。然後,對於每個包,將行更改Auto-Installed: 0Auto-Installed: 1將包標記為手動安裝。

APT 本身並不會追蹤已安裝軟體包的依賴關係,這是由 dpkg 完成的。該資訊位於/var/lib/dpkg/statusDebian 上。 Aptitude 具有進階搜尋功能,可以對依賴項進行操作,但 apt 不行。您可以對 進行一些臨時解析/var/lib/dpkg/status。以下腳本(經過最低限度的測試)產生一些已安裝的軟體包所依賴的軟體包清單:

</var/lib/dpkg/status awk '
    /^Package:/ {package=$2}
    /^Status:/ && $4 != "installed" {package=""}
    /^(Depends|Pre-Depends|Recommends|Suggests):/ && package != "" {
        sub(/^[^:]*: */, "");
        gsub(/ (\([^()]*\))/, "");
        split($0, dependencies, /[|, ]+/);
        for (d in dependencies) print dependencies[d]}
' | sort -u >dependencies.txt

查看該列表,也許刪除一些恰好是依賴項的套件行,但您知道無論如何您都想保留它們。然後用它來調整/var/lib/apt/extended_states

</var/lib/apt/extended_states awk '
    BEGIN {
        while (getline <"dependencies.txt") auto[$0]=1;
        RS="";
    }
    $2 in auto {sub(/\nAuto-Installed: 0/, "\nAuto-Installed: 1")}
    {print $0 "\n"}
' >extended_states.new

檢查輸出文件,如果您滿意,請將其移至適當位置。

相關內容