删除指定目录下除特定文件外的所有文件

66 篇文章 0 订阅
47 篇文章 0 订阅

        要求在一个目录下删除除名为file(或file1, file2等,视情况而定)之外的所有文件。这里我将重新阐述并详细解释如何使用bash的shell扩展和xargs命令来实现这一目标。


方案一:使用Shell扩展(适用于支持扩展的Shell,如bash)

        对于bash shell,可以直接使用!()来进行反向选择(即选择除了括号内指定的文件之外的所有文件)。这种方法简单且直接。

单个文件:

rm -rf !(file)

        注意:这个命令在默认bash配置下可能不会直接工作,因为bash的shopt -s extglob需要被启用以支持扩展的glob模式(包括!(pattern))。如果未启用,你需要先运行shopt -s extglob。

多个文件:

shopt -s extglob  # 确保扩展的glob模式被启用  

rm -rf !(file1|file2)

        这个命令会删除除了file1和file2之外的所有文件和目录。


方案二:使用grep -v和xargs

        如果你的shell不支持上述的!()扩展,或者出于某种原因你想使用更通用的方法,可以使用ls、grep -v和xargs的组合。

命令示例:

ls | grep -v 'file\|file2' | xargs -r rm -rf

注意几个要点:

        ls列出当前目录下的所有文件和目录。
        grep -v 'file\|file2'过滤掉包含file或file2的行。这里使用了正则表达式和管道符|来匹配多个文件名。
        xargs -r rm -rf将grep的输出作为参数传递给rm -rf命令进行删除。-r(或-I,取决于xargs版本)选项在xargs中是可选的,但在这里我们使用了-r(或--no-run-if-empty),它会在没有输入时阻止rm命令的执行,这是一个好习惯,可以防止在没有任何文件匹配时误删除重要文件。

        xargs的详细解释:

                xargs命令从标准输入构建并执行命令。
                -r(或--no-run-if-empty)选项防止在输入为空时执行命令。
                在某些版本的xargs中,可以使用-I {}选项来指定一个替换字符串(默认为{}),它会在每次执行命令时被输入项替换。但在这个例子中,我们不需要它,因为rm -rf可以直接接受多个文件名作为参数。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值