小编Ali*_*xel的帖子

如何在简单的 shell 脚本中获取分发名称和版本号?

我正在开发一个简单的 bash 脚本,它应该能够在 Ubuntu 和 CentOS 发行版上运行(对 Debian 和 Fedora/RHEL 的支持将是一个加分项),我需要知道脚本正在运行的发行版的名称和版本(以触​​发特定操作,例如创建存储库)。到目前为止,我所得到的是:

OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')

if [ -z "$OS" ]; then
    OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi

if [ -z "$VERSION" ]; then
    VERSION=$(awk '{print $3}' /etc/*-release)
fi

echo $OS
echo $ARCH
echo $VERSION
Run Code Online (Sandbox Code Playgroud)

这似乎有效,返回ubuntu或centos(我没有尝试过其他人)作为发布名称。但是,我有一种感觉,必须有一种更简单、更可靠的方法来解决这个问题——这是真的吗?

它不适用于 RedHat。/etc/redhat-release 包含:Redhat Linux 企业版 5.5 …

linux shell-script distributions

231
推荐指数
8
解决办法
29万
查看次数

使用 rsync 移动文件和删除目录?

最近我需要删除大量文件(超过 100 万个),我读到这样做:

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Run Code Online (Sandbox Code Playgroud)

是最优化的方法之一,我可以保证它比rm -rf.

我不是这方面的专家,但根据我的理解,rsync 性能的原因与它列出文件的方式有关(我想是 LIFO 而不是 FIFO)。现在,问题是,我还需要以有效的方式移动大量文件。经过一番搜索,我发现了这个:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Run Code Online (Sandbox Code Playgroud)

虽然这会删除所有移动的文件中~/source,该目录留在那里。由于我有一个类似“循环”的目录结构,数量files/directories非常接近 1,所以我不得不再次运行第一个命令以完全摆脱目录:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Run Code Online (Sandbox Code Playgroud)

直线mv几乎会立即完成,但我的~/destination目录中有应该保留的文件,所以mv不是一个选项。我找到了--prune-empty-dirs和--forcersync 选项,但似乎都没有像我期望的那样工作:

--force                 force deletion of directories even if not empty
--prune-empty-dirs      prune empty directory chains from the …
Run Code Online (Sandbox Code Playgroud)

bash rsync rm synchronization files

17
推荐指数
2
解决办法
5万
查看次数

通过命令行自动安装 VirtualBox Guest Additions

如何以无人参与的方式从 Bash 脚本安装VirtualBox Guest Additions?

每当我apt-get -y install dkms virtualbox-guest-dkms从终端运行时,我都会看到一个交互式对话框,有什么方法可以安全地绕过或预先选择对话框选项?

debian apt software-installation virtualbox package-management

5
推荐指数
1
解决办法
1598
查看次数

从 Bash 脚本安装 MySQL

我正在编写一个 bash 脚本来自动化部署 VPS 服务器的过程,但是在尝试从aptitude/apt-get或安装 MySQL 时遇到了一些问题yum,这是我目前所拥有的:

if [ "$OS" == 'centos' ]; then
    yum -y install  mysql-server > /dev/null 2>&1
elif [ "$OS" == 'ubuntu' ]; then
    aptitude -y install mysql-server > /dev/null 2>&1
fi
Run Code Online (Sandbox Code Playgroud)

似乎脚本一直在无限运行,我怀疑问题是因为该mysql-server包似乎显示了一个向导来指定 MySQL 根密码,但我不知道如何从脚本中克服或填写密码。

有谁知道我如何解决这个问题?

yum ubuntu centos apt mysql

2
推荐指数
1
解决办法
2730
查看次数