我正在尝试创建一个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
如果找到“目标”,我怎么能限制搜索不会继续进入子目录?
答案 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