我有一個要匯入的 mongodump,顯然我希望使用該find命令來執行此操作。像這樣的東西:
find *.bson -type f -exec echo mongoimport --db=abc --collection=$(echo '{}' | sed s/.bson//g) {} \;
我正在尋找的是沒有得到評估我需要的是
mongoimport --db=abc --collection=a a.bson
但我得到的是
mongoimport --db=abc --collection=a.bson a.bson
我的sed用于去除.bson后綴的版本'{}'不起作用。我知道這不是一個障礙,但我覺得這是否可能。
有什么建議么?
uj5u.com熱心網友回復:
問題有兩個:
Shell 擴展:在 shell 環境中執行命令之前,shell (sh/bash/ksh/zsh) 將執行一系列擴展以構建正在執行的實際命令。執行的擴展有七種:大括號擴展、波浪號擴展、引數和變數擴展、命令替換、算術擴展、分詞和路徑名擴展。因此,在
find執行命令之前,它將執行所有替換,包括位于exec陳述句中的命令替換。因此,該命令相當于:$ find *.bson -type f -exec echo mongoimport --db=abc --collection={} {} \;一種前進的方法是通過使用單引號來禁止命令替換,但這會導致問題二。
find的 exec 陳述句是有限的: -exec 可以執行的命令僅限于帶有可選引數的外部實用程式。因此無法識別各種外殼特征。直接使用 shell 內置函式、函式、條件、管道、重定向等-exec是不可能的,除非包裹在sh -c子 shell 之類的東西中。
因此,答案將是以下內容:
$ find *.bson -type f -exec /usr/bin/sh -c 'echo mongoimport --db=abc --collection=$(echo {} | sed s/.bson//g) {}' \;
uj5u.com熱心網友回復:
針對這個問題提出不同的策略。
使用findwith option-printf來準備你的命令。
結果將是要執行的命令串列(每行命令)。
檢查和測驗命令后,將find命令輸出保存到檔案中并運行該檔案(作為bash腳本)。
或者直接運行bash命令。
1.find結果檢查:
find . -type f -name "*.bson" -printf "mongoimport --db=abc --collection=%f %f\n" | sed s/.bson//
請注意sed僅在第一場比賽時更換.bson。不要使用選項g。
2. 運行處理和檢查find的輸出。
bash <<< $(find . -type f -name "*.bson" -printf "mongoimport --db=abc --collection=%f %f\n" | sed s/.bson//)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473106.html
下一篇:遞回洗掉bash中的所有空檔案夾
