0

假设我有一个目录/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 仅删除现有文件?或者至少防止它抛出所有这些错误?

4

3 回答 3

2

您可以使用rm -f,如果文件不存在,它不会抱怨:如手册页中所示,“忽略不存在的文件,从不提示”。

于 2012-11-23T21:24:39.667 回答
2

添加-f作为 rm 参数将防止这种情况发生。但是,另一方面,您需要确保您的 glob 是可靠的,以免删除太多。

于 2012-11-23T21:24:50.350 回答
1

添加shopt -s nullglob-- 如果没有匹配模式的文件,则替换空字符串而不是模式字符串。

要删除除一个以外的所有内容,请使用

shopt -s extglob
rm !(*pdo*).ini
于 2012-11-24T01:29:23.750 回答