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循环.任何建设性的意见将不胜感激.
尝试类似的东西
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中至少有两个(修复并不难).
归档时间: |
|
查看次数: |
4942 次 |
最近记录: |