我正在开发一个实时文件系统,需要能够下载带有其依赖项的 deb 文件,我使用以下命令手动执行此操作:
apt download $(apt-cache depends --recurse --no-recommends --no-suggests
--no-conflicts --no-breaks --no-replaces --no-enhances
--no-pre-depends ${PACKAGES} | grep "^\w")
之后,我需要data.tar.gz
从所需的 deb 包中提取所有文件,将它们合并到一个唯一的文件夹中(该mv
命令在合并文件夹时不是很有用),我手动使用两者/usr/bin/ar x
或dpkg-deb
稍后结合使用从 $DEB 中tar
提取所有文件data.tar.gz
。
有没有一种 bash 方法可以自动化整个过程,而不管下载的 $DEB 文件的数量?
答案1
最后就这样结束了
#!/bin/bash
# Developed by Roberto Gonzalez for Slide Linux
# Root only
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
FILE="`echo $1 | rev | cut -d. -f2- | rev`.fs"
archiveDir=/var/cache/apt/archives
destinationDir=/run/initramfs/memory/data/modules
apt update
apt install -d "$1" -y || { echo 'apt2fs failed' ; exit 1; }
mkdir $archiveDir 2>/dev/null
mkdir $archiveDir/deb
mkdir $archiveDir/deb/WE
mv $archiveDir/*.deb $archiveDir/deb/ || { echo 'apt2fs failed' ; exit 1; }
cd $archiveDir/deb
for z in *.deb; do ar x $z data.tar.gz | tar xfv data.tar.gz -C WE/; done 2>/dev/null
for z in *.deb; do ar x $z data.tar.xz | tar xfv data.tar.xz -C WE/; done 2>/dev/null
for z in *.deb; do ar x $z data.tar.zst | tar xfv data.tar.zst -C WE/; done 2>/dev/null
# Some cleanup
rm -rf WE/usr/share/doc 2>/dev/null
rm -rf WE/usr/share/doc-base 2>/dev/null
rm -rf WE/usr/share/fonts 2>/dev/null
rm -rf WE/usr/share/locale 2>/dev/null
rm -rf *.*
starthome 2>/dev/null
dir2fs $archiveDir/deb/WE $destinationDir/$FILE || { echo 'apt2fs failed' ; exit 1; }
rm -rf $archiveDir
echo "Done. Module created"
尽管文件系统存在一些问题,导致某些模块无法使用,但仍然运行顺利。