如何在bash中使用带命令的find命令?

时间:2017-11-06 04:58:13

标签: bash

目录结构类似于

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命令..

有什么问题?

1 个答案:

答案 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 

-Ixargs后面的字符串就像是从前一个管道收到的输入的占位符,并将其传递给下一个命令。 -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,而后者不是我推荐的选项。