![如何删除当前目录中除最后两个文件之外的所有文件](https://linux22.com/image/103418/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E4%B8%AD%E9%99%A4%E6%9C%80%E5%90%8E%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.png)
假设当前目录中有 10 个文件/home/usr
。它们的编号为1
- 10
。如果我想删除除9
和 之外的所有文件10
,我该怎么做?
我可以通过执行以下操作来选择底部两个文件
ls -l /home/usr/ | tail -2
但是,我将如何使用此信息来删除除最后两个之外的所有信息?换句话说,我将如何删除1
- 8
?
我要澄清一些事情。我想根据文件列表ls -l
而不是具体根据文件名称来删除。正如那些1
-10
文件就是例子。它应该删除文件,无论具体名称如何,并删除ls -l
.
答案1
和zsh
:
echo rm -f /home/usr/*(n[1,-3])
echo
(高兴时删除)
n
按数字顺序排序(2 后 10)[1,-3]
仅选择第一个到倒数第三个。
(D
如果您还想考虑隐藏文件,请添加 glob 限定符)
答案2
不太漂亮的非zsh
解决方案:
find . -name 'prefix*' | sort -V | head -n -2 | xargs echo rm --
假设:
- 假设所有文件都共享相同的文件名前缀
prefix
,并且名称中没有换行符或其他有趣的字符。 - 您的
sort
支持-V
,并且在您的情况下排序正确(我使用相同的简单prefix
+数字形式的文件对其进行了测试,它对我有用,在顺便说一句touch prefix{1..100}
中使用生成bash
)。 - 你们的
head
支持-n
。
(当前所有 GNU/Linux 发行版均应支持这些参数。)
移除echo
即可解锁。
答案3
如果你的文件确实被命名为1到10,你可以使用
rm {1,8}
或者它的变体来指示范围,例如foobar{1,8}
。