删除带有 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
我有一个类似这样的子文件夹:
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