首页 > 解决方案 > 使用 rm 和 ls 时无法通过 SSH 删除目录

问题描述

我在将代码部署到服务器时尝试清理发布目录,但我需要保留至少 5 个。

现在我使用这个命令来做我提到的。

rm -rf $(ls -1t /path/to/deploy/release | tail -n +6)

当我在服务器上运行它时,一切看起来都很好,但是当我尝试通过 ssh 运行时它不起作用。. .

ssh user@123.456.789.100 'rm -rf $(ls -1t /path/to/deploy/release | tail -n +6)'

任何人请帮助或建议我。我做错了什么?

标签: linuxbash

解决方案


警告:就像所有涉及rm -Rf和“应该工作”的事情一样,下面的内容实际上可能会删除计算机上的所有文件(因为ssh涉及到,那就是本地和远程计算机),并可能让你的厨房着火。我对损坏等不承担任何责任......备份(存储在厨房以外的地方)总是一件好事,也许你应该rm -Ri先测试一下?

您没有说失败是什么,但我注意到的一件事是该ls命令将在目录中生成文件名列表/path/to/deploy/release,但rm不会在该目录中运行,因此它将尝试删除这些名称的文件您的主目录而不是/path/to/deploy/release. 这很容易通过cd首先进入该目录来修复(尽管请确保编写命令,以便如果cd失败,它不会只是随机删除错误目录中的文件)。

另一个问题是该命令依赖于分词来将输出ls ... | tail ...转换为文件名列表,如果任何文件名包含空格和/或通配符,这将失败。这更难解决,所以我会忽略这个问题,希望它永远不会在你身上爆发。

无论如何,cd修复(和未修复的空白错误),这就是我得到的:

ssh user@123.456.789.100 'cd /path/to/deploy/release && rm -Rf $(ls -1t | tail -n +6)'

同样,rm -Ri建议使用(并拥有良好的备份)进行测试。


推荐阅读