【问题标题】:remove a subfolder with bash if it exsits如果存在,则使用 bash 删除子文件夹
【发布时间】:2023-04-07 20:08:01
【问题描述】:

我有一个子文件夹,例如:

USERS = /opt/users/

我想删除 /opt/users 的子文件夹而不定义新变量,例如:

if [ -d $USERS/phones ] && [-d $USERS/emails]; then
     rm -Rf $USERS/phones 
     rm -RF $USERS/emails
else 
     echo "Folder does not exist, continuing the process"
fi

问题是你能建议一些更聪明的方法还是足够好?如果其中一个文件夹不存在或者我有另一个 && 条件,我不知道如何处理?和两个命令 rm -Rf 我不确定它看起来有点难看。有什么建议吗?

【问题讨论】:

  • -f 将导致rm 忽略不存在的文件夹,因此无需进行这些额外检查,除非您必须为每个单独的文件显示该日志。

标签: linux bash shell automation


【解决方案1】:

首先,一些通用的 bash 提示:


话虽如此,让我们仔细看看rm -f

-f, --force

忽略不存在的文件和参数,从不提示

因此,如果文件夹存在,则无需添加额外的检查。

您可以将代码更改为:

USERS="/opt/users/"
rm -Rf "$USERS/phones"
rm -RF "$USERS/emails"

如果您想为每个不存在的文件添加echo,我们需要检查它是否存在:
How can I check if a directory exists in a Bash shell script?

使用short if/else,代码可能如下所示:

USERS="/opt/users/"
[[ -d "$USERS/phones" ]] && rm -Rf "$USERS/phones" || echo '/phones does not exists'
[[ -d "$USERS/emails" ]] && rm -Rf "$USERS/emails" || echo '/emails does not exists'

上面的代码可以使用array's来简化:

declare -a folders=("phones" "emails")
for i in "${arr[@]}"
do
   [[ -d "$USERS/$i" ]] && rm -Rf "$USERS/$i" || echo "/$i does not exists"
done

【讨论】:

    【解决方案2】:

    假设可能有可变数量的子目录要删除,OP 代码的变体:

    users=/opt/users/                        # refrain from using ALL CAPS for user-defined variables
    rmlist=(phones emails 'other schtuff')   # array of subdirectory names
    
    for subdir in "${rmlist[@]}"
    do
        [[ -d "${users}/${subdir}" ]] && rm -Rf "${users}/${subdir}" && continue
        echo "Folder ${users}/${subdir} does not exist, continuing the process"
    fi
    

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多