各サブフォルダを繰り返し、フォルダを確認してスクリプトを実行します。

各サブフォルダを繰り返し、フォルダを確認してスクリプトを実行します。

さまざまな深さのサブフォルダがあるディレクトリがあります。すべての項目を繰り返して特定の名前のフォルダが含まれていることを確認し、そのディレクトリが存在する場合はスクリプトを実行したいと思います(foo.sh混乱を避けるためにこのスクリプトを呼び出します)。

foo.shターゲットフォルダが見つかったら、現在のフォルダで実行する必要があります。例:

/A
  /subA-1
  /subA-2
    /target
  /subA-3
    /sub-subA-3
       /target

私が探しているコマンド/スクリプトはで実行する必要があり、名前付きフォルダを/A探すすべてのサブフォルダを繰り返しますtarget。入力すると、/subA-2この条件が満たされ、/subA-2foo.shが実行されます。同じ/sub-subA-3ですが、そうではありません/subA-3

foo.sh入力は不要で、含めるだけです/target

答え1

それは簡単です:

find A -type d -name target -execdir foo.sh \;

マニュアルページから:

-execdirコマンド;

-execに似ていますが、指定されたコマンドは一致するファイルを含むサブディレクトリで実行されます。

例:

問題に応じてディレクトリ構造を作成して印刷します。

/tmp$ mkdir A; cd A
/tmp/A$ mkdir -p subA-1 subA-2/target subA-3/sub-subA-3/target
/tmp/A$ find .
.
./subA-2
./subA-2/target
./subA-3
./subA-3/sub-subA-3
./subA-3/sub-subA-3/target
./subA-1

これで、コマンドを実行して何が起こるかをpwd示しますfoo.sh

/tmp/A$ find . -type d -name target -execdir pwd \;
/tmp/A/subA-2
/tmp/A/subA-3/sub-subA-3

答え2

zshを使う:

cd /A && for dir (**/target(/N:h) (cd -- $dir && foo.sh)

答え3

最も簡単な方法は、すべてのディレクトリ検索を使用してfindからスクリプトを変更して、foobar正しい名前のディレクトリがあるかどうかを確認することです。

#!/bin/bash

targetDir="$@"   ## The directory to run the script on
dirName="target" ## Change this to whatever the "target" is
cd "$trargetDir"
## Exit if the $targetDir doesn't have a directory with 
## the name you're looking for
[ -d "$targetDir"/"$dirName" ] || exit

## If it does, cd into the $targetDir and continue the script
cd "$targetDir"

### The rest of the script goes here
...

これでコマンドを実行しfind、見つかったすべてのディレクトリでスクリプトを実行できるようになります。

find /target -type d -exec /path/to/script.sh "{}" \; 

すべてのことを行うこともできますが、find個人的には上記の解決策がよりきれいであると思います。しかし、それはあなた次第です。 1つの方法は次のとおりです。

pwd="$PWD"; find . -type d -name foobar -printf '%h\0' | 
    while IFS= read -d '' dir; do cd "$dir" && foo.sh; cd "$pwd"; done

答え4

検索コマンドを使用します。

人々が見つけたいくつかの例があります。

find /tmp -name core -type f -print | xargs /bin/rm -f

find . -type f -exec file '{}' \;

関連情報