使用正则表达式删除多个文件

使用正则表达式删除多个文件

我有一个文件夹,其中包含具有相同文件的子文件夹,例如:

 dsc_9660__content_w.jpg
 dsc_9660__content.jpg
 dsc_9660__h70.jpg
 dsc_9660__small.jpg
 dsc_9660.jpg

后缀-是不同大小的图像。

如何删除所有带有后缀的文件,如下所示:__[a-zA-z0-9].(png|jpg|jpeg)
并仅保留没有后缀的原始图像,如dsc_9660.jpg我的示例所示

答案1

尝试寻找命令及其-regex开关或-iregex(不区分大小写),将您的正则表达式更改为.*__[a-zA-z0-9_]*\.(png|jpg|jpeg)并使用该-delete选项删除匹配的文件:

find . -type f -regextype "posix-egrep" -iregex '.*__[a-zA-z0-9_]*\.(png|jpg|jpeg)$'

您可以使用其他类型的-regextype(有效的)代替“posix-egrep”,例如:
“posix-extended”或“posix-awk”。

-regex pattern
    File  name matches regular expression pattern.  This is a match on the whole path, not a search.  For
    example, to match a file named './fubar3', you can use the regular expression '.*bar.'  or '.*b.*3',
    but not 'f.*r3'. The regular expressions understood by find are by default Emacs Regular Expres‐
    sions, but this can be changed with the -regextype option.

-iregex pattern
    Like -regex, but the match is case insensitive.

-regextype type
    Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the
    command line. Currently-implemented types are emacs (this is the default), posix-awk, posix-basic,
    posix-egrep and posix-extended.

-delete
    Delete files

最后添加-delete开关到命令来删除匹配的文件:

find . -type f -regextype "posix-egrep" -iregex '.*__[a-zA-z0-9_]*\.(png|jpg|jpeg)$' -delete

.*__[a-zA-z0-9_]*\.(png|jpg|jpeg)
  • 匹配.*之前的所有__
  • 匹配__双下划线。
  • 匹配[a-zA-z0-9_]*所有字母数字和单个下划线_字符。这*意味着此类字符的长度可以为零。
  • 匹配\.单个点。要逐字匹配点 ( .),您需要在正则表达式中使用反斜杠对其进行转义;如果不进行转义,它将匹配任何单个字符。
  • 在 中(png|jpg|jpeg),一对括号使其成为一组匹配项。将匹配png或 ( |)jpgjpeg
  • 锚点$,匹配字符串的结尾(或在本例中为文件名)

正则表达式可视化

Debuggex 演示对文件进行测试


答案2

cd <dir>
find . -type f -iname \*__*.jpg -delete

答案3

尝试以下命令,

cd <dir>
find . -type f -iname \*.jpg -delete

-type----> 输入文件的类型(__[a-zA-z0-9].(png|jpg|jpeg))并使用该命令。

希望这可以帮助。

相关内容