带有 !(pattern-list) 的 SSH 远程命令

Ste*_*eve 5 linux ssh bash

我正在尝试使用 SSH 从远程主机中删除/path/to/dir/除两个目录 (dir1dir2)之外的所有文件和目录。当我在本地 Ubuntu 14.04 机器上运行与此类似的命令时,它按预期工作:

user@host1:~$ cd /path/to/dir/ && rm -rf !(dir1|dir2)
Run Code Online (Sandbox Code Playgroud)

如果我尝试在具有相同目录结构的另一台主机上通过 SSH 执行相同的命令,则会失败。

user@host1:~$ ssh user@host2 'cd /path/to/dir/ && rm -rf !(dir1|dir2)'
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd /path/to/dir/ && rm -rf !(dir1|dir2)'
Run Code Online (Sandbox Code Playgroud)

我应该如何转义命令以使其工作?我认为使用单引号就足够了。

111*_*181 2

如果你真的想使用 bash 模式,你可以这样做:

\n\n
user@remote:~$ ls del/\n1  2  3\nuser@desktop:~$ ssh remote.example \'PATTERN="!(1|2)" bash -O extglob -c "cd del && echo rm \\$PATTERN"\'\nrm 3\n
Run Code Online (Sandbox Code Playgroud)\n\n

我宁愿使用 find (-delete如果您确实想删除文件,请附加):

\n\n
 user@desktop:~$ ssh remote.example \'cd del && find . ! -path . ! \\( -name 1 -or -name 2 \\)\'\n./3\n
Run Code Online (Sandbox Code Playgroud)\n\n

目录示例:

\n\n
user@remote:~/del$ tree -F\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1/\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 11/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 2/\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 22/\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 3/\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 33/\nuser@remote:~/del$ find . -maxdepth 1 -type d \'!\' -path . ! \\( -name 1 -or -name 2 \\) -print0 | xargs -0 echo rm -r\nrm -r ./3\n
Run Code Online (Sandbox Code Playgroud)\n