使用 !(pattern-list) 的 SSH 远程命令

使用 !(pattern-list) 的 SSH 远程命令

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

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

如果我尝试在具有相同目录结构的另一台主机上通过 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)'

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

答案1

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

user@remote:~$ ls del/
1  2  3
user@desktop:~$ ssh remote.example 'PATTERN="!(1|2)" bash -O extglob -c "cd del && echo rm \$PATTERN"'
rm 3

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

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

目录示例:

user@remote:~/del$ tree -F
.
├── 1/
│   └── 11/
├── 2/
│   └── 22/
└── 3/
    └── 33/
user@remote:~/del$ find . -maxdepth 1 -type d '!' -path . ! \( -name 1 -or -name 2 \) -print0 | xargs -0 echo rm -r
rm -r ./3

相关内容