次のような構造のディレクトリがあるとしましょう。
project/
├── folder1/
│ └── mainline
| └── ...
├── folder2/
│ └── mainline
| └── ...
├── folder3/
│ └── mainline
| └── ...
.
.
.
└──folderN/
└── mainline
└── ...
各フォルダant clean
からコマンドを実行したいです。mainline
どうすればいいですか?
答え1
示されたディレクトリ階層のant clean
すべてのディレクトリで実行されているとします。mainline
for mainline in project/folder*/mainline/; do
( cd "$mainline" && ant clean )
done
mainline
これは各ディレクトリのパス名を繰り返します。これらのパス名ごとに、ループ本文はそのディレクトリに変更され、ant clean
そのディレクトリで実行されます。
ループ内のコマンドの周りの括弧は、サブシェルのコマンドを実行します。作業ディレクトリへの変更はそのサブシェルに対してローカルです(cd
入力したディレクトリを「終了」する必要はありません)。
mainline
表示されるディレクトリが次の場合ただディレクトリの場合は、find
次のように使用できます。
find project -type d -name mainline -execdir sh -c 'cd mainline && ant clean' \;
これは見つけるでしょうどのmainline
以下で呼び出されたディレクトリは各ディレクトリで実行されますproject
。ant clean
これ-execdir
は非標準ですが、通常はfind
ほとんどのUnicesのユーティリティによって実装されています。
build.xml
デフォルトで使用されているファイルを見つけて、そのファイルを含むすべてのディレクトリで実行することもできます。ant
ant clean
mainline
find project -type f -path '*/mainline/build.xml' -execdir ant clean \;
答え2
このように:
$ cd project/
$ find . -type d -name "mainline" -exec ls -l {} \;
その後、現在のフォルダ(project /)で "mainline"というディレクトリを見つけて、ls -l
各ディレクトリで実行します。