删除带有 bash 的子文件夹(如果存在)

remove a subfolder with bash if it exsits

我有一个类似这样的子文件夹:

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 我不确定它看起来有点丑陋。有什么建议吗?

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

  • 考虑引用字符串
    When to wrap quotes around a shell variable?

  • =
    两边没有空格 Command not found error in Bash variable assignment


也就是说,让我们仔细看看 rm -f:

-f, --force

ignore nonexistent files and arguments, never prompt

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

您可以将代码更改为:

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

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