6

Я пытаюсь удалить все файлы и каталоги в /path/to/dir/ за исключением двух каталогов (dir1 и dir2) с удаленного хоста, используя SSH. Когда я запускаю команду, похожую на эту, на моем локальном компьютере с Ubuntu 14.04, она работает как положено:

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 ответ1

3

если вы действительно хотите использовать шаблоны 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .