目录结构类似于
home
--dir1_foo
----subdirectory.....
--dir2_foo
--dir3_foo
--dir4_bar
--dir5_bar
我试图使用'发现'命令首先获取包含特定字符串的目录(在本例中为' foo'),然后使用' find'再次命令检索符合条件的一些目录。
所以,我先试过
#!/bin/bash
for dir in `find ./ -type d -name "*foo*" `;
do
for subdir in `find $dir -mindepth 2 -type d `;
do
[Do some jobs]
done
done
,这个脚本运行正常。
然后我认为只使用一个带有下面管道的循环也可以,但这不起作用
#!/bin/bash
for dir in `find ./ -type d -name "*foo*" | find -mindepth 2 -type d `;
do
[Do some jobs]
done
实际上这个脚本和
一样for dir in `find -mindepth 2 -type d`;
do
[Do some jobs]
done
,这意味着忽略第一个find命令..
有什么问题?
答案 0 :(得分:3)
你的剧本正在做什么不是一个好习惯,并且有很多潜在的陷阱。请参阅BashFAQ- Why you don't read lines with "for"以了解原因。
您可以使用xargs
和-0
来读取空分隔文件,并使用另一个find
命令而无需使用for-loop
find ./ -type d -name "*foo*" -print0 | xargs -0 -I{.} find {.} -mindepth 2 -type d
-I
中xargs
后面的字符串就像是从前一个管道收到的输入的占位符,并将其传递给下一个命令。 -print0
选项是GNU特定的,这是一个安全的选项来处理包含空格或任何其他shell元字符的文件名/目录名。
所以使用上面的命令,如果你有兴趣对第二个命令的输出做一些操作,那么用while
命令做一个进程替换语法,
while IFS= read -r -d '' f; do
echo "$f"
# Your other actions can be done on "$f" here
done < <(find ./ -type d -name "*foo*" -print0 | xargs -0 -I{.} find {.} -mindepth 2 -type d -print0)
到目前为止,您使用find的管道无法正常工作的原因是您不正在读取之前的find命令的输出。您需要xargs
或-execdir
,而后者不是我推荐的选项。