2017-11-06 9 views
1

ディレクトリ構造私が取得するために、再度コマンドを「検索」を使用、その後、(この場合の「FOO」)、最初に特定の文字列を含むディレクトリを取得するためのコマンドを「検索」を使用しようとしている bashのパイプでfindコマンドを使うにはどうすればいいですか?

home 
--dir1_foo 
----subdirectory..... 
--dir2_foo 
--dir3_foo 
--dir4_bar 
--dir5_bar 

のように見えますいくつかのディレクトリは条件に一致します。

だから、私は最初

#!/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

できればそれを避けてください。 '-exec'プライマリを使用してコマンドを含むスクリプトを実行するか、代わりにパス名の拡張を使用してみてください。この場合、単に 'foo */*/* foo */'の' for dir'を使うことができるようです。あなたの 'find'コマンドと同じディレクトリを取得することをお勧めします。 – chepner

答えて

3

あなたのスクリプトが行っていることは、良いプラクティスではなく、潜在的な落とし穴がたくさんあります。理由を理解するには、BashFAQ- Why you don't read lines with "for"を参照してください。

あなたは使用することなく、ヌル区切りファイルを読み込み、別のfindコマンドを使用する-0xargsを使用することができるため、ループ

find ./ -type d -name "*foo*" -print0 | xargs -0 -I{.} find {.} -mindepth 2 -type d 

受信した入力用のプレースホルダのような-Ixargsでの行為を次の文字列前のパイプラインから次のコマンドに渡します。 -print0オプションは、スペースやその他のシェルメタ文字を含むファイル名/ディレクトリ名を渡すための安全なオプションであるGNU固有のものです。

あなたは第二のコマンドからの出力の上にいくつかのアクションを行うことに興味があるのであれば、インプレース上記のコマンドで、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のいずれかが必要ですが、後者は私が推奨するオプションではありません。

関連する問題