0

我的问题更多的是关于代码效率和简单性的问题,而不是简单地完成一项任务。场景是这样的:我想创建一个 bash 脚本,当它位于每个用户主目录中时,它使用 for 循环遍历 /Users 我希望它查看两个不同的目录是否存在以下样式:

for USER in /Users/*; do
    if [ -d "$USER/Library/Caches/com.spotify.Client" ]; then 
        rm -rf "$USER/Library/Caches/com.spotify.Client"

...但我需要检查多个目录。我如何以最优雅的方式完成此任务?我想避免使用一系列 if 语句,但不知道实现这一点的最佳方法。

最后,我想用find命令找到一个文件,然后将find的结果(即找到的文件的路径)设置为一个变量,并输入到另一个命令中。谢谢你。

4

2 回答 2

2

根据我对您的要求的了解,我将嵌套for循环:

subdirs=(
    "Library/Caches/com.spotify.client"
    "some/other/subdir/"
)

for homedir in /Users/*; do
    for subdir in "${subdirs[@]}"; do
        dir="$homedir/$subdir"
        if [[ -d "$dir" ]]; then
            rm -rf "$dir"
        fi
    done
done
于 2012-06-06T02:57:14.197 回答
1

以下内容建立在@David Wolever 上面的回答之上;这些版本更短,让 shell 在前面做更多的 globbing。

不使用中间(数组)变量的内联单循环版本:

for dir in /Users/*/'Library/Caches/com.spotify.client/' /Users/*/'some/other/subdir/'; do
    [[ -d "$dir" ]] && rm -rf "$dir"
done

数组变量版本:

subdirs=(
    'Library/Caches/com.spotify.client/'
    'some/other/subdir/'
)

for subdir in "${subdirs[@]}"; do
    for dir in /Users/*/"$subdir"; do 
        [[ -d "$dir" ]] && rm -rf "$dir"
    done
done
于 2012-06-06T05:04:06.533 回答