我可以rm
用正则表达式修改命令或者删除一些东西吗?当前目录中的每个文件(扩展名为*.bmp
,*.wav
和*.png
? 的文件除外)它应该不区分大小写,因为有像*.BMP
或 之类的文件*.bMP
。
答案1
@ChrisDown 已经给出了一个bash
办法这会考虑到文件和目录的差异,以及是否没有要删除的文件。
然而,考虑到rm
在这些情况下会失败,该命令可以简化为(仍然使用bash
):
shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png)
请记住将两个 shell 选项重置为其默认值。就我而言,extglob
已经在交互式 shell 上设置了,所以我只需要
shopt -u nocaseglob
或者在子 shell 中运行这两个命令:
(shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png))
如果您想提前查看哪些文件将被删除,只需rm
将echo
.
如果您还希望删除隐藏文件,请添加该dotglob
选项。
答案2
如果您正在使用,则可以使用和bash
的组合。extglob
nocaseglob
shopt -s extglob nocaseglob
for file in !(@(*.bmp|*.wav|*.png)); do
[[ -f "${file}" ]] && files+=( "${file}" )
done
(( ${#files[@]} )) && rm "${files[@]}"
否则你可以像下面这样:
find . -maxdepth 1 -type f ! \( -iname '*.bmp' -o -iname '*.wav' -o \
-iname '*.png' \) -delete
答案3
用 zsh
, 删除常规的除.bmp
, .png
, .wav
(不区分大小写)之外的文件:
setopt extendedglob # best in ~/.zshrc
rm -- ^*.(#i)(png|bmp|wav)(D.)
(D
如果您想保留隐藏文件而不管其扩展名如何,请删除上述内容)。
答案4
我建议您花一点时间分多个步骤进行此操作,这样您就不会意外地做任何愚蠢的事情。
创建一个命令来识别要删除的文件,例如
ls | grep -v *.bmp | grep -v *.wav # current directory
或者
find . -type f | grep -v *.bmp # current and sub directories
如果返回的文件列表是您要删除的文件,那么
调用最后一个命令并将该
xargs rm
命令添加到其中,例如ls | grep -v *.bmp | grep -v *.wav | xargs rm