comando remoto SSH com! (lista de padrões)

5

Estou tentando excluir todos os arquivos e diretórios em /path/to/dir/ , exceto por dois diretórios ( dir1 e dir2 ) de um host remoto usando SSH. Quando executo um comando semelhante a este na minha caixa local do Ubuntu 14.04, ele funciona como esperado:

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

Se eu tentar executar o mesmo comando através do SSH em outro host com a mesma estrutura de diretório, ele falhará.

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)'

Como devo escapar do comando para fazê-lo funcionar? Eu pensei que usar aspas simples era o suficiente.

    
por Steve 15.10.2016 / 00:15

1 resposta

3

se você realmente quiser usar padrões bash, faça isso:

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

Eu prefiro usar o find embora (anexar -delete se você realmente deseja excluir os arquivos):

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

Exemplo com diretórios:

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
    
por 15.10.2016 / 00:55

Tags