2

I'm making a bash script; how do I find files not ending with specific extensions?

#!/bin/bash
find . -type f -print | grep "\.\(?!psd\|xcf\).+$"

Thank you.

Limeth
  • 513
  • 6
  • 16

2 Answers2

5

You can use:

find . -regextype posix-egrep -type f ! -regex '.*\.(psd|xcf)$'

Or without regex:

find . -type f -not \( -name '*.psd' -o -name '*.xcf' \)
anubhava
  • 761,203
  • 64
  • 569
  • 643
1

You can use -v grep param like this:

find . -type f -print | grep -v "${NOT_PATTERN}"

So, in your case you can use:

find . -type f -print | grep -v "\.\(psd|xcf\)$"

Documentation

-v, --invert-match Invert the sense of matching, to select non-matching lines.

Federico Piazza
  • 30,085
  • 15
  • 87
  • 123