【发布时间】:2012-11-23 21:22:24
【问题描述】:
假设我有一个目录/etc/php5/conf.d/,其中包含以下假设文件:
mysql.ini
mysqli.ini
20-mysql.ini
20-mysqli.ini
20-pdo_mysql.ini
我想删除除最后一个 (pdo) 之外的所有这些文件,这是我目前拥有的:
for phpIni in mysql mysqli; do
if [[ -f /etc/php5/conf.d/$phpIni.ini ]]; then
rm /etc/php5/conf.d/$phpIni.ini
if [[ -f /etc/php5/conf.d/20-$phpIni.ini ]]; then
rm /etc/php5/conf.d/20-$phpIni.ini
fi
done
它有效,但我不禁注意到上面可以用 glob 模式简化,例如:
if [[ ! -z /etc/php5/conf.d/{,20-}mysql*ini ]]; then
rm /etc/php5/conf.d/{,20-}mysql*ini
fi
但是有一个问题,如果任何扩展不存在,rm 会抱怨它:
$ if [[ ! -z /etc/php5/conf.d/{,20-}mysql*ini ]]; then rm /etc/php5/conf.d/{,20-}mysql*ini; fi
rm: cannot remove `/etc/php5/conf.d/20-mysql*ini': No such file or directory
如何让 rm 只删除现有文件?或者至少防止它抛出所有这些错误?
【问题讨论】:
-
if测试不会做你想做的事。[[ ! -z /etc/php5/conf.d/{,20-}mysql*ini ]]始终为真,无论是否存在与该模式匹配的任何文件。我认为这是因为 bash 在这种情况下不进行模式匹配,但即使这样做了它仍然无法工作,因为未匹配的模式未展开(除非您先执行shopt -s nullglob)。 -
@GordonDavisson:我使用
echo而不是rm命令对其进行了测试,它似乎只在至少一个文件存在时才回显字符串。我错过了什么吗? -
很奇怪;它总是为我执行
echo(尽管如果设置了nullglob,echo只会打印一个空行)。您使用的是哪个版本的 bash?我有 3.2.48(1)-release。 -
@GordonDavisson:我使用的是 Ubuntu 12.04.1 LTS 附带的 4.2.24(1)-release。无论如何我可以确认
shopt的当前状态标志吗? -
shopt nullglob将打印其当前状态(shopt将单独打印所有可设置选项的状态)。
标签: bash list conditional-statements glob rm