删除目录中除一个文件外的所有内容 - 使用 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.
如果太复杂,我会复制一个脚本到远程并执行它。
在 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.
如果太复杂,我会复制一个脚本到远程并执行它。