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/*: 没有那个文件或目录
如何在一个命令中完成这一切?
您可以通过一次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.