You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化Bash中查找并删除非指定类型文件的命令语法?

简化批量删除非媒体文件的find命令

你的思路是对的,extglob确实能大幅简化命令,下面是具体实现方法,同时补充另一种不依赖shell扩展的通用方案:

方案一:使用extglob扩展通配符

extglob的@()语法可以匹配括号内的任意一个模式,结合!取反就能替代重复的! -iname参数:

# 开启extglob扩展(脚本中建议加上,交互式shell如果默认没开也需要执行)
shopt -s extglob
# 执行删除命令
find . -type f ! -iname '@(*.mp4|*.avi|*.mkv|*.mov|*.wmv|*.mpg|*.vob|*.m4v|*.flv|*.ts|*.jpg|*.jpeg|*.png)' -delete
# 可选:关闭extglob,避免影响后续命令
shopt -u extglob

方案二:使用find的正则匹配(跨shell通用)

如果不想依赖shell的extglob扩展,可以用find自带的-iregex选项(忽略大小写的正则匹配),语法更通用:

find . -type f ! -iregex '.*\.\(mp4\|avi\|mkv\|mov\|wmv\|mpg\|vob\|m4v\|flv\|ts\|jpg\|jpeg\|png\)$' -delete

进阶优化:维护后缀列表

如果需要频繁修改媒体后缀,可以把后缀存成变量,提升可维护性:

MEDIA_SUFFIXES="mp4|avi|mkv|mov|wmv|mpg|vob|m4v|flv|ts|jpg|jpeg|png"
find . -type f ! -iregex ".*\.\($MEDIA_SUFFIXES\)$" -delete

注意事项

  • 测试阶段建议去掉-delete,换成-print或-ls,确认匹配的文件是需要删除的再执行删除操作
  • 如果是在脚本中使用extglob,要确保脚本用bash执行(开头加#!/bin/bash),因为sh不支持extglob

内容的提问来源于stack exchange,提问作者Martin Julien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:03:26