
*.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
がループとして機能し、短い例では、パス名がワイルドカードパターンを使用して生成されることです(現在のディレクトリのみ)。
関連: