ファイル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 wikipediaのページ。 (それが必要です。そうしないと、最初の引数は処理されません。)以前に使用したことがないことを認めますが、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がループとして機能し、短い例では、パス名がワイルドカードパターンを使用して生成されることです(現在のディレクトリのみ)。

関連:

関連情報