如何使用“find”命令限制目录搜索?

时间:2018-04-14 17:03:33

标签: linux bash shell

我正在尝试创建一个Bash脚本,该脚本会为具有“target”子目录的目录创建符号链接。我使用“find”命令搜索“目标”目录并将文件路径放入数组。

array_of_dirs=( $(find -type d -name "target") )

循环数组并对目录建立符号链接。 我的问题是目录结构的深度是未知的,子目录可以有多个“目标”目录。

目录结构可以是:

    .
    ├── blaah
    │   ├── jee1
    │   │   └── omg1
    │   │       └── bar1
    │   │           └── target <--- When this is found, no need to continue into subdirectories
    │   │               └── wtf1
    │   │                   └── target
    │   ├── jee2
    │   │   └── target
    │   ├── jee3
    │   └── jee4
    └── blaah2
        ├── jou1
        │   └── target
        ├── jou2
        └── jou3
            └── target <--- When this is found, no need to continue into subdirectories
                ├── foo1
                │   └── target
                ├── foo2
                │   └── target
                └── foo3
                    └── target

目前找到这些路径并且创建了不需要的符号链接。

    ./blaah/jee1/omg1/bar1
    ./blaah/jee1/omg1/bar1/target/wtf1 <--- Unwanted
    ./blaah/jee2
    ./blaah2/jou1
    ./blaah2/jou3
    ./blaah2/jou3/target/foo1 <--- Unwanted
    ./blaah2/jou3/target/foo2 <--- Unwanted
    ./blaah2/jou3/target/foo3 <--- Unwanted

如果找到“目标”,我怎么能限制搜索不会继续进入子目录?

4 个答案:

答案 0 :(得分:1)

过滤不需要的结果。

array_of_dirs=( $(find -type d -name "target" | grep -v target/) )

答案 1 :(得分:0)

您可以强制find命令在找到第一个匹配项后立即停止:

find dir pattern -print -quit

答案 2 :(得分:0)

在创建符号链接之前,设置if条件以检查找到的目录是否不是已找到的目标目录的子目录:

src="file:///C:/Users/Username/Desktop/file.csv"

另外,我不确定

的结果如何
if [ $( echo ${DIR} | grep -o "target" | wc -l) -eq 1 ] 
then
    # create symlink 
fi

应包括&#34; ./ blaah / jee1 / omg1 / bar1 / target / wtf1&#34; 。你在用什么操作系统?

答案 3 :(得分:0)

最短的解决方案,即使它最后被发现(伊士曼自己在评论中提出)。

array_of_dirs=($(find -type d -name "foo" -prune))

使用-path选项,您可以排除包含整个令牌&#34; / target /&#34;的路径。与-name(仅评估文件名本身)相比,路径需要通过globbing来捕获foo / target和target / bar。当然它需要否定-not -path&#34; / target / &#34;。

array_of_dirs=($(find -type d -not -path "*/target/*" -name "target"))

对我的系统和foo进行测试而不是目标:

find -type d -name "foo" 
./tmp/bar/bar/foo
./tmp/bar/foo
./tmp/test/bar/foo
./tmp/foo
./tmp/foo/foo
./tmp/foo/foo/foo

find -type d -not -path "*/foo/*" -name "foo" 
./tmp/bar/bar/foo
./tmp/bar/foo
./tmp/test/bar/foo
./tmp/foo

选项-path ... -prune似乎具有相同的效果。有关详细信息,请仔细阅读本手册。一个简短的测试显示使用修剪可以获得10%的时间效益,但它可以是缓存效果或随机影响。

(不必要的冗长的中间解决方案:)

find -type d -name&#34; foo&#34; -path&#34; / foo &#34; -prune