用 rm 清除多个目录

Mic*_*dan 4 shell bash shell-script rm

我正在尝试清除存储在数组中的多个目录。这是一个简化的示例(我有更多目录)。

#!/bin/bash    

$IMAGES_DIR="/Users/michael/scripts/imagefiles"
$BACKUP_DIR="/Users/michael/scripts/imagebackups"

...

array=( $IMAGES_DIR $BACKUP_DIR )
for i in ${array[@]}
do
    if [ "$(ls -A $i)" ]; then     # check that directory has files in it
        rm "$i/"*                  # remove them 
    fi
done
Run Code Online (Sandbox Code Playgroud)

我收到每个目录的错误,例如:

rm: /Users/michael/scripts/imagefiles/*: 没有那个文件或目录

B L*_*yer 5

如何在一个命令中完成这一切?

您可以通过一次find调用捕获文件存在检查、通配和删除。在 GNU 版本的情况下,find我们有这个:

for f in "${array[@]}"; do
     find "$f" -type f -delete
done
Run Code Online (Sandbox Code Playgroud)

如果您没有 GNU,请find使用此调用:

find "$f" -type f -exec rm -f {} +
Run Code Online (Sandbox Code Playgroud)

(如果不是从整个目录层次结构中清除文件,您只想清除直接子级的文件,然后在-maxdepth 1之前添加-type f。)

但是等等,还有更多......

正如John1024 明智地指出的那样,您可以通过将数组作为第一个参数传递给 来完全放弃循环find

     find "${array[@]}" -type f -delete
Run Code Online (Sandbox Code Playgroud)

这是因为:1) find将接受在一次执行中搜索和处理的多个目录2) shell 将拆分数组,以便每个元素(目录)成为find.