当我运行以下命令时:
sudo apt-get install vim abcde php5-cli
它会失败并显示以下消息,这是预期的行为:
E:无法找到包 abcde`。
我希望它能够安装vim
,即使出现错误,也abcde
继续安装php5-cli
软件包。这意味着我希望apt-get
继续沿着列表向下安装,即使它找不到某些软件包。
我试过了:
sudo apt-get install --ignore-missing vim abcde php5-cli
答案1
简短回答:有可能您实际上并不想这样做。
这是为什么? 关于这个特定功能已经有很多讨论。其中一个讨论是(重复)错误报告以及与其相链接的那个。
错误报告中的讨论还解释了“--ignore-missing”仅适用于下载包时出现问题的情况,而根据 'apt-get' 的信息,该包本来应该存在。这也解释了这里并在文档。
有解决方法吗?
如果在阅读了之前的资料后,你仍然非常确定要这样做,那么另一方面,也存在(次优但相当安全的)选项,例如用户“Aleksandr Levchuk”指定的选项这里:
for i in package1 package2 package3; do
sudo apt-get install $i
done
或者,如果您愿意,可以使用最少修改的一行代码:
for i in package1 package2 package3; do sudo apt-get install $i; done
如果包很多,可以添加,-y
这样就不会重复要求确认:
for i in package1 package2 package3; do
sudo apt-get install -y $i
done
或者:
for i in package1 package2 package3; do sudo apt-get install -y $i; done
希望这可以帮助。
答案2
尽管其他答案确实有效,但每个包执行单独的安装调用存在一些问题:
- 它消除了很多要点/优势,
apt
以及提前确定哪些包会共享依赖关系或发生冲突的能力 - 如果需要 sudo(通常),则在安装所有软件包之前可能会达到 sudo 超时
最近,我遇到了这个问题,因为我正在将个人机器从一个 Ubuntu 18.04(Bionic)安装移动到另一个较新的干净版本的 Ubuntu 20.04(Focal),但想在新机器上安装相同的软件包......我想出了一个很好的解决方案:
我从一个包含列表的文件开始从旧机器生成,每个包名称都在单独的行上,可以通过以下命令轻松生成:
apt list --installed 2>/dev/null | sed 's/\/.*//g > packages'
然后,我通过 apt 运行文件列表,将列表过滤为新机器/存储库上可用且非虚拟的所有软件包,同时将结果传输到另一个文件,回显进度,并最终安装生成的软件包:
# Filter packages for those available
while read package; do apt show "$package" 2>/dev/null | grep -qvz 'State:.*(virtual)' && echo "$package" >>packages-valid && echo -ne "\r\033[K$package"; done <packages
# Install the available packages all at once
sudo apt install $(tr '\n' ' ' <packages-valid)
这确实有效!
希望这也能被其他人所接受。:)
答案3
避免这种情况的一种方法是调用 apt-get每个包裹一次:
echo package1 package2 package3 | xargs -n 1 sudo apt-get install -y
或者作为函数
function install_ignore_fail { echo "$*" | xargs -n 1 sudo apt-get install -y; }
install_ignore_fail package1 package2 package3
答案4
我想出了一个功能,它允许安装一堆软件包,并忽略那些不可用且可能破坏完整安装的软件包。
install_aval_package() {
for i in $1
do
if [ -z "$(apt-cache madison $i 2>/dev/null)" ]; then
echo " > Package $i not available on repo."
else
echo " > Add package $i to the install list"
packages="$packages $i"
fi
done
echo "$packages" #you could comment this.
apt-get -y install $packages
}
像这样使用它,
install_aval_package "bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail"
或者像这样,
install_aval_package "bmon \
curl \
dialog \
git \
htop \
language-pack-en-base \
molly-guard \
nano \
net-tools \
ntp \
openssh-server \
software-properties-common \
ssh \
sudo \
wget \
whiptail"
在这种情况下,输出包含存储库中所有请求的包,
> Add package bmon to the install list
> Add package curl to the install list
> Add package dialog to the install list
> Add package git to the install list
> Add package htop to the install list
> Add package language-pack-en-base to the install list
> Add package molly-guard to the install list
> Add package nano to the install list
> Add package net-tools to the install list
> Add package ntp to the install list
> Add package openssh-server to the install list
> Add package software-properties-common to the install list
> Add package ssh to the install list
> Add package sudo to the install list
> Add package wget to the install list
> Add package whiptail to the install list
bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail
Reading package lists... Done
Building dependency tree
Reading state information... Done
etc....