删除目录中除一个文件外的所有内容 - 使用 SSH

Delete Everything in a Directory Except One FIle - Using SSH

在 BASH 中,以下命令删除目录中除一个文件外的所有内容:

rm -rf !(filename.txt)

但是,在 SSH 中,相同的命令不会更改目录中的任何内容,它 returns 出现以下错误:-jailshell: !: event not found

所以,我用\转义了!,(括号也需要转义)但是还是不行:

rm -rf \!\(filename.txt\)

它 returns 没有错误,目录中没有任何更改。

甚至可以在 SSH 中 运行 这个命令吗?我找到了一个解决方法,但如果可能的话,它会大大加快速度。

我使用以下别名连接到 ssh 服务器:

alias devssh="ssh -p 2222 -i ~/.ssh/private_key user@host"

!(filename.txt) 是一个 extglob,一个可能需要启用的 bash 未来。确保您的 ssh 服务器运行 bash 并且启用了 extglob:

ssh user@host "bash -O extglob -c 'rm -rf !(filename.txt)'"

或者使用您的别名:

devssh "bash -O extglob -c 'rm -rf !(filename.txt)'"

如果确定远程系统默认使用bash,也可以去掉bash -c部分。但是您的错误消息表明 ssh 服务器运行 jailshell.

ssh user@host 'shopt -s extglob; rm -rf !(filename.txt)'
devssh 'shopt -s extglob; rm -rf !(filename.txt)'

我不会那样做的。我不会依赖 bash 在远程,我不会依赖任何 bash 主义。我会使用:

$ ssh user@host 'rm $(ls | grep -v "^filename.txt$")'

如果我想防止目录可能为空的可能性,我会将 $(...) 的输出分配给一个变量,并测试它是否为空。如果我担心命令可能太长,我会将名称写入文件,然后将 grep 输出发送到 rm xargs.

如果太复杂,我会复制一个脚本到远程并执行它。