Linux 删除除某个文件之外的所有文件

本文介绍如何在Linux命令行环境下,通过rm-f!()命令实现批量删除目录下的特定文件,提供解决工作需求的实用技巧,并附带解决bash提示错误的方案。

不知你是否想过在Linux命令行上,如何实现删除除了某个文件之外的所有文件?

如abc文件夹下有a、b、c三个文件,如何一行命令删除b和c,不删除a。有位童鞋在工作经常有此需求,本文将介绍其他童鞋提供的实现方法。

其中rm -f !(a)最为方便。如果保留a和b,可以运行rm -f !(a|b)来实现。

不过一般bash中运行后会提示

“-bash:!:eventnotfound ” 可以通过运行shopt -s extgolb来解决。如下:

[root@localhost/]#mkdirabc

[root@localhost/]#cdabc

[root@localhostabc]#touchabc

[root@localhostabc]#ls

abc

[root@localhostabc]#rm-f!(a)

-bash:!:eventnotfound

[root@localhostabc]#shopt-sextglob

[root@localhostabc]#rm-f!(a)

[root@localhostabc]#ls

a

[root@localhostabc]#touchbcd

[root@localhostabc]#rm-f!(a|b)

[root@localhostabc]#ls

ab

另外也可以使用下面的方法:

[root@localhostabc]#ls

abc

[root@localhostabc]#ls|grep-va|xargsrm-f

[root@localhostabc]#ls

a


转载地址:http://blog.51osos.com/linux/linux-delete-file/

<think>好的,用户想在Linux系统中删除某个特定文件之外的所有文件。我需要先回顾一下相关的命令和方法。根据用户提供的引用,特别是引用[2]和[4],提到了使用`rm -rf !(filename)`的方法,但要注意bash版本是否支持extglob选项。另,引用[4]还提到了需要先开启extglob,使用`shopt -s extglob`命令。 首先,我需要确认用户使用的shell是否是bash,并且版本是否足够高,因为低版本可能不支持这种语法。如果用户的bash版本较低,可能需要采用其他方法,比如使用find命令结合排选项。例如,使用`find`命令查找了目标文件的所有文件,然后通过`-exec`或`xargs`传递给`rm`命令。这种方法在引用中没有直接提到,但根据我的知识,这是一种可行的替代方案。 另,用户可能需要删除的是当前目录下的文件,或者是指定目录下的文件。需要明确是否需要处理子目录中的文件。如果用户只是想删除当前目录下的文件而不包括子目录,可能需要调整命令的参数,比如在find命令中使用`-maxdepth 1`来限制搜索深度。 还有,用户可能对命令的安全性有顾虑,特别是在使用`-rf`这样的强制删除选项时。应该提醒用户在执行删除操作前确认路径和文件名,避免误删重要文件。可以建议先使用`ls`命令测试模式匹配的结果,确保只有预期的文件被选中删除。 此,引用[4]中提到使用`shopt -s extglob`来启用扩展模式匹配,这在bash中是必须的步骤。用户可能不知道需要先运行这个命令,所以需要在回答中明确指出。 最后,需要比较不同方法的优缺点,比如使用`rm`直接排和使用`find`命令排,哪种更可靠或更兼容。考虑到不同的环境,提供多种解决方案可以让用户根据自己的情况选择合适的方法。 总结步骤: 1. 使用`shopt -s extglob`启用扩展模式。 2. 执行`rm -rf !(filename)`删除filename文件。 3. 如果bash版本不支持,改用find命令。 4. 提醒用户谨慎操作,提前备份或测试。</think>在Linux系统中删除指定目录下某个特定文件的所有文件,可以通过以下方法实现: ### 方法1:使用`extglob`模式匹配(推荐) ```bash # 进入目标目录(假设要操作的目录是 /path/to/dir) cd /path/to/dir # 启用bash的扩展模式匹配 shopt -s extglob # 删除"filename"的所有文件及子目录 rm -rf !(filename) # 恢复默认模式(可选) shopt -u extglob ``` *注意*:`!(filename)`表示排名为`filename`的文件/目录[^2][^4] --- ### 方法2:使用`find`命令(兼容性更好) ```bash find /path/to/dir -mindepth 1 -maxdepth 1 -not -name "filename" -exec rm -rf {} \; ``` *参数说明*: - `-mindepth 1`:排目录本身 - `-maxdepth 1`:仅处理当前目录 - `-not -name`:排指定文件[^1] --- ### 方法3:结合通配符(适用于简单场景) ```bash # 删除当前目录下所有文件(保留隐藏文件) rm -rf * # 删除当前目录下所有内容(包括隐藏文件) rm -rf .[^.]* ..?* * ``` --- ### █ 注意事项 1. **路径验证**:执行前先用`ls !(filename)`或`find`命令预览要删除文件 2. **权限问题**:确保对目标目录有写权限 3. **隐藏文件**:上述方法默认不处理隐藏文件(以`.`开头的文件),需特殊处理 4. **版本兼容**:低版本bash需通过`shopt -s extglob`启用扩展模式[^4] 5. **危险操作**:`rm -rf`会**永久删除**文件且无法恢复,建议先备份
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值