ディレクトリ内のすべてのフォルダに対してコマンドを実行するには?

ディレクトリ内のすべてのフォルダに対してコマンドを実行するには?

次のような構造のディレクトリがあるとしましょう。

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以下で呼び出されたディレクトリは各ディレクトリで実行されますprojectant cleanこれ-execdirは非標準ですが、通常はfindほとんどのUnicesのユーティリティによって実装されています。

build.xmlデフォルトで使用されているファイルを見つけて、そのファイルを含むすべてのディレクトリで実行することもできます。antant cleanmainline

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各ディレクトリで実行します。

関連情報