特定の拡張子を持つファイルを含むサブフォルダでコマンドを実行する

特定の拡張子を持つファイルを含むサブフォルダでコマンドを実行する

皆さん、こんにちは、

特定の拡張子を持つファイルを含むサブフォルダからコマンドを実行しようとしています。フォルダ自体内でコマンドを実行し、フォルダ自体内で出力を生成したいと思います。

これは私が達成したいことを示す図です。私はこれから始めます:

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    └── file2.abc
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    └── file.def
    └── subfolder 4

この場合、サブフォルダ1と3を見つけて、そのフォルダからコマンドを実行したいと思います。そのコマンドの出力も、以下のようにそのフォルダ内にあります。

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    ├── file2.out
    │    └── subfolder.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    ├── file.out
    │    └── subfolder.out
    └── subfolder 4

このコードはうまくいきます。内部で実行してくださいfolder

if ()(($#)) */*.(abc|def|ghi)(NY1-.); then

        for file (*/*.(abc|def|ghi)) command1 $file && command2 ${file} > $file.out && command3 * > subfolder.out
    else echo "No appropriate files found"
fi

ただし、フォルダ内またはフォルダ内の各サブフォルダのファイルを生成しようとするときは、command3そのフォルダ*内に結果を含むファイルを生成したいと思います。私が得たのは、スクリプトをどこで実行しても、私が望むフォルダ内にあるのではなく、ファイルが作成され上書きされることです。したがって、このスクリプトをtop内で実行すると、次のような結果が得られます。*.(abc|def|ghi)subfolder.outfolder

.
└── folder
    ├── subfolder.out
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    └── file2.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    └── file.out
    └── subfolder 4

私はそれを次のように生成したいと思います。

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    ├── file2.out
    │    └── subfolder.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    ├── file.out
    │    └── subfolder.out
    └── subfolder 4

要約すると、サブフォルダに特定の拡張子を持つファイルがあるかどうかをテストし、そのファイルを含むフォルダ内でコマンドを実行し、結果の出力がそのファイルが作成されたフォルダ内にあることを確認します。特定の拡張子を持つフォルダで見つかったすべてのファイルだけでなく、ワイルドカードでもコマンドを実行したいと思います*.(abc|def|ghi)。 command3を実行したいです。みんな拡張子を持つ個々のファイルを探すのではなく、拡張子を持つファイルを探します。

基本的に欲しい cd 正しい拡張子を持つファイルを含むフォルダに移動します。 command3 * > subfolder.out 。文書 subfolder.out 正しいサブフォルダーに作成してアーカイブする必要があります。

どうすればいいですか?よろしくお願いします。

答え1

次のオプションをfind使用してコマンドを試してください。-execdir

find <directory> -type f -name "*.<extension>" -execdir <command> {} \;

このfindコマンドは以下を検索します。目次拡張子(*)を持つすべてのファイルの場合拡大するそれは実行されるでしょう注文する{}ファイル()が配置されているディレクトリ。

他の例:

find /home/mike/ -type f -name "*.java" -execdir pwd \;

上記のコマンドは、ディレクトリ内のすべてのJavaファイルを検索し、見つかったファイルの現在の作業ディレクトリ()を/home/mike/印刷します。pwd現在のファイルでコマンドを実行する必要がある場合は、{}最初の例に示されているコマンドを使用してください。

したがって、基本的にこれはあなたのユースケースに適しているはずです。

$ tree
.
├── subfolder1
│   ├── test2.abc
│   ├── test2.efgs
│   └── test.abc
├── subfolder2
│   └── test.def
└── subfolder3
    └── test.xyz

次に検索を実行します。

find /home/mike/ -type f \( -name "*.abc" -o -name "*.def" -o -name "*.ghi" \) -execdir sh -c "command3 '{}' > subfolder.out" \;

その結果は次のとおりです。

tree
.
├── subfolder1
│   ├── subfolder.out
│   ├── test2.abc
│   ├── test2.efgs
│   └── test.abc
├── subfolder2
│   ├── subfolder.out
│   └── test.def
└── subfolder3
    └── test.xyz

関連情報