`find -exec`を使用して、見つかったファイルのディレクトリ(現在のディレクトリではない)でコマンドを実行する方法は?


15

、のは、私はいくつかのサブディレクトリを持つディレクトリにいるとしましょうdir1dir2dir3。これらの各ディレクトリにはファイルがfooありfoo、各ディレクトリで同じコマンドを実行し、そのディレクトリ内からそのコマンドを実行したいと考えています。

「手動」で行うと、次のようになります。

cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)

コマンドは、各ディレクトリから実行する必要があります。 fooバッチスケジューリングスクリプト(知りたい場合はHTCondorの場合)であり、スケジューリングスクリプトによって開始された実行の出力が各サブディレクトリで終了するように、各サブディレクトリから実行する必要があります。

ファイルを見つけてファイルのディレクトリでコマンドを実行する」という質問は、私の知る限り、私の質問に答えません。その質問への最初の回答は私の場合には機能しない回避策の詳細であり、2番目の回答はそれを使用する方法を知るための十分な説明がありません。


@roaima、それが重複している方法を説明してください。その質問の最初の答えはないではない私を助け、それはより多くの仕事の周りのだ、と第二の答えは私にはどんな意味がありません。使い方を知るにはもっと説明が必要です。
NeutronStar 2016

回答:


23

あなたfindがそれをサポートしていると仮定して、-execdir代わりにオプションを使用してください-exec

find * -name 'foo' -execdir pwd \;

そうでない場合は、プラットフォームおよび/またはディストリビューションの詳細を(必要に応じて)提供してください。


あなたが打つ起動すると、 "見つける:相対パス」を./node_modules/.bin'を、PATH環境変数に含まれている":askubuntu.com/questions/621132/...
チロSantilli冠状病毒审查六四事件法轮功

私がそれをそのように書くかもしれない場合は申し訳ありませんが、-execdir(Ubuntu)はたわごと{}です{}
uav

1
@uavあなたのユースケースを知らずに私はあなたを助けることができません。しかし、あなたの声に応じて、ドキュメントには「ライク-execですが、指定されたコマンドは一致したファイルを含むサブディレクトリから実行されます明記されています
roaima

はい、そうです。-typed(=ディレクトリ)を探している場合は特別なケースであり、最適ではありません。
uav

あなたのユースケースを知らなければ、私はあなたを助けることができません。
roaima

3

コマンドを実行するディレクトリを正確に知っていると仮定すると、

for dir in dir1 dir2 dir3; do
    ( cd "$dir" && somecommand foo )
done

または、fooファイルをループして、

for foo in */foo; do
  ( cd "${foo%/*}" && somecommand foo )
done

サブシェルcdは、スクリプトの残りの作業ディレクトリに影響を与えないようにします。${foo%/*}ディレクトリの名前にパラメータ置換が膨張するfoo(最後の後にすべてを除去することにより、ファイルが住んでいる/の値で$foo)。

標準findを使用して同じことを行う(fooファイルがディレクトリ構造の深いところにある場合):

find . -type f -name foo -exec sh -c '
    for foo do
        ( cd "${foo%/*}" && somecommand foo )
    done' sh {} +

つまり、現在のディレクトリまたはその下の任意の場所にある「foo」と呼ばれるすべての通常のファイルを見つけて、このシェルスクリプトにパス名をバッチで指定します。シェルスクリプトは、指定されたパス名を反復処理し、ディレクトリを各パス名のディレクトリ部分に変更し、成功した場合はを実行しsomecommand fooます。

非標準を使用するソリューションについては、roaimaの回答を-execdir参照してください。私の例に合わせた彼の答え:

find . -type f -name foo -execdir somecommand foo ';'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.