さまざまな深さのサブフォルダがあるディレクトリがあります。すべての項目を繰り返して特定の名前のフォルダが含まれていることを確認し、そのディレクトリが存在する場合はスクリプトを実行したいと思います(foo.sh
混乱を避けるためにこのスクリプトを呼び出します)。
foo.sh
ターゲットフォルダが見つかったら、現在のフォルダで実行する必要があります。例:
/A
/subA-1
/subA-2
/target
/subA-3
/sub-subA-3
/target
私が探しているコマンド/スクリプトはで実行する必要があり、名前付きフォルダを/A
探すすべてのサブフォルダを繰り返しますtarget
。入力すると、/subA-2
この条件が満たされ、/subA-2
foo.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 '{}' \;