删除除少数扩展名之外的所有内容

删除除少数扩展名之外的所有内容

我可以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))

如果您想提前查看哪些文件将被删除,只需rmecho.

如果您还希望删除隐藏文件,请添加该dotglob选项。

答案2

如果您正在使用,则可以使用和bash的组合。extglobnocaseglob

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

我建议您花一点时间分多个步骤进行此操作,这样您就不会意外地做任何愚蠢的事情。

  1. 创建一个命令来识别要删除的文件,例如

        ls | grep -v *.bmp | grep -v *.wav  # current directory
    

    或者

        find . -type f | grep -v *.bmp      # current and sub directories
    

    如果返回的文件列表是您要删除的文件,那么

  2. 调用最后一个命令并将该xargs rm命令添加到其中,例如

        ls | grep -v *.bmp | grep -v *.wav | xargs rm
    

相关内容