[英]find: missing argument to -exec with ssh
嘗試從服務器刪除目錄:
ssh myname@servera ssh othername@serverb find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} ;
我嘗試用\\;
和\\;;
和;
和"{}"
和-exec sh -c 'rm -r "{}"' \\;
所有得到的錯誤find: missing argument to "-exec'"
謝謝
當您要使用特殊字符時,使用ssh直接運行命令通常很難甚至不可能。 這是因為ssh遠程調用sh -c "<<COMMAND HERE>>"
。 這導致字符被引用兩次/取消引用兩次,有時甚至被刪除。
最好的選擇是在遠程系統上使用命令創建一個臨時文件並執行它:
echo 'find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} \;' > script
scp script myname@servera:
ssh myname@servera bash script
就您而言,可以使用find的-delete
命令而不是-exec
。
@cbley是正確的,這樣做很棘手。 盡管如此,有時還是希望避免創建額外的文件。 如果是這樣,您可以這樣進行:
ssh myname@servera " \"${cmd}\" " 2>&1
其中$ cmd是您之前定義的整個命令:
cmd="find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} ;"
與其嵌套對ssh
調用,不如使用-J
選項並將命令作為單個參數發送,而不是將ssh
必須連接在一起的一系列參數發送給命令。
ssh -J myname@servera othername@severb \
"find /var/lib/jenkins/some/path/to/check -name '2.2.4*' -type d -exec rm -r {} \;"
這樣,您只需要擔心命令通過單個外殼傳遞即可。
謝謝你的幫助。 我的最終解決方案不是使用新腳本,而是臨時將其保存在數組中(這對我和bash技能似乎更容易):
dirArray=( $(ssh myname@servera ssh othername@serverb find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d) )
for i in "${dirArray[@]}"
do
echo "deleting $i"
ssh myname@servera ssh othername@serverb rm -r $i
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.