ファイルjsonを見つけて生成されているか確認するか実行する

ファイルjsonを見つけて生成されているか確認するか実行する

*.json2 ファイルを見つけて、POST が実行されていない場合はそれらが実行されるかどうかを確認します。

私は持っている

1.json2
2.json2  2.json2.ml
3.json2  3.json2.ml

私はこのコマンドを使用します

find . -type f -name '*.json2' | if [{}.ml]; then -exec sh -c 'curl -X POST -H "Content-Type: application/json" -d @{} https://api.myweb.com/api > {}.ml' \;

ml 拡張子のないファイルのみを実行したいです。ありがとうございます

答え1

の使用を検討しましたかxargs?

find . -type f -name '*.json2' | xargs bash -c 'for fname; do if [ ! -e ${fname}.ml ]; then curl -X POST -H "Content-Type: application/json" -d @${fname} https://api.myweb.com/api > ${fname}.ml; fi; done' bash

その末尾についてはbash、私が最近学んだ「トリック」ですxargs ウィキペディアページ(これがないと最初の引数は処理されません。)これまで使用したことがなかったのですが、echo コマンドといくつかのテスト ファイルでテストしたところ、必要な動作をしているようです。

答え2

find . -type f -name '*.json2' -exec sh -c '
    for pathname; do
        [ -e "$pathname.ml" ] && continue
        curl -X POST -H "Content-Type: application/json" -d @"$pathname" https://api.myweb.com/api >"$pathname.ml"
    done' sh {} +

これは、現在のディレクトリ内またはその下にある、ファイル名がパターンに一致するすべての通常ファイルを検索します*.json2。これらのファイルのバッチに対して、短いシェル スクリプトが実行されます。このスクリプトは、 によって指定された各パス名に対してfind、パス名に対応するファイルがあるかどうかをテストします.ml。存在しない場合は、コマンドcurlが実行されます。

すべてのファイルが現在のディレクトリにのみ配置されている場合、これは次のように簡略化できます。

for pathname in ./*.json2; do
    [ -e "$pathname.ml" ] && continue
    curl -X POST -H "Content-Type: application/json" -d @"$pathname" https://api.myweb.com/api >"$pathname.ml"
done

これは本質的にその通りによって呼び出されるスクリプトと同じループfind。唯一の違いは、最初の例では がfindループのパス名ジェネレーターとして機能するのに対し、短い例では、パス名はグロビング パターンを使用して生成されることです (現在のディレクトリからのみ生成されます)。

関連している:

関連情報