使用排除列表在bash中查找包含find的目录

Ade*_*sso 6 linux bash printf find

现在在你想到之前,"这已经完成了"请继续阅读.

像大多数尝试执行查找bash脚本的人一样,你最终会将脚本硬编码为单行命令,但最终会在接下来的几个月/几年内编辑这个内容,所以你希望最后你做得对第一次.

我现在正在编写一个小备份程序来备份目录并需要找到它们,而不是需要排除的Directorie列表.说起来容易做起来难.让我开始吧:

#!/bin/bash
BasePath="/home/adesso/baldar"
declare -a Iggy
Iggy=( "/cgi-bin" 
    "/tmp" 
    "/test" 
    "/html" 
    "/icons" )
IggySubdomains=$(printf ",%s" "${Iggy[@]}")
IggySubdomains=${IggySubdomains:1}
echo $IggySubdomains
exit 0
Run Code Online (Sandbox Code Playgroud)

现在在这结束时你得到/ cgi-bin,/ tmp,/ test,/ html,/ icons 这证明了这个概念有效,但是现在为了更进一步,我需要使用find来搜索BasePath并搜索所有子目录只有一个级别,并排除数组中的子目录列表...

如果我手动输入,它将是:

find /var/www/* \( -path '*/cgi-bin' -o -path '*/tmp' -o -path '*/test' -o -path '*/html' -o -path '*/icons' \) -prune -type d
Run Code Online (Sandbox Code Playgroud)

我是否应该想循环到每个子目录并做同样的事情......我希望你明白我的观点.

所以我想要做的似乎是可能的,但我有一点问题,printf",%s"不喜欢我使用所有这些find -path或-o选项.这是否意味着我必须再次使用eval?

我试图在这里使用bash的功能,而不是一些for循环.任何建设性的意见将不胜感激.

Sor*_*gal 5

尝试类似的东西

find /var/www/* \( -path "${Iggy[0]}" $(printf -- '-o -path "*%s" ' "${Iggy[@]:1}") \) -prune -type d
Run Code Online (Sandbox Code Playgroud)

看看会发生什么.

编辑:在示例中将前导*添加到每个路径.

这是基于您的描述的完整解决方案.

#!/usr/bin/env bash
basepath="/home/adesso/baldar"
ignore=("/cgi-bin" "/tmp" "/test" "/html" "/icons")

find "${basepath}" -maxdepth 1 -not \( -path "*${ignore[0]}" $(printf -- '-o -path "*%s" ' "${ignore[@]:1}") \) -not -path "${basepath}" -type d
Run Code Online (Sandbox Code Playgroud)

$ basepath的子目录,不包括$ ignore中列出的那些,假设$ ignore中至少有两个(修复并不难).