
我想找到 *.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
這將找到檔案名稱與目前目錄中或目前目錄下的模式相符的所有常規檔案。對於批次的這些文件,將執行一個簡短的 shell 腳本。此腳本針對 給定的每個路徑名測試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
充當循環的路徑名產生器,而在較短的範例中,路徑名是使用通配模式產生的(並且僅從目前目錄產生)。
有關的: