I have a bunch of files in a folder:
foo_1
foo_2
foo_3
bar_1
bar_2
buzz_1
...
I want to find all the files that do not st
Using bash and wildcards: ls [!bar_]*
. There is a caveat: the order of the letters is not important, so rab_something.txt
will not be listed.
This should do the trick in any shell
ls | grep -v '^prefix'
The -v option inverts grep's search logic, making it filter out all matches. Using grep instead of find you can use powerful regular expressions instead of the limited glob patterns.
With extended globs:
shopt -s extglob
ls !(bar_*) > filelist.txt
The !(pattern)
matches anything but pattern
, so !(bar_*)
is any filename that does not start with bar_
.
If you're doing subdirectories as well:
find . ! -name "bar_*"
Or, equivalently,
find . -not -name "*bar_*"
You want to find filenames not starting with bar_*
?
recursive:
find ! -name 'bar_*' > Negatives.txt
top directory:
find -maxdepth 1 ! -name 'bar_*' > Negatives.txt
In my case I had an extra requirement, the files must end with the .py
extension. So I use:
find . -name "*.py" | grep -v prefix_
In your case, to just exclude files with prefix_
:
find . | grep -v prefix_
Note that this includes all sub-directories. There are many ways to do this, but it can be easy to remember for those already familiar with find
and grep -v
which excludes results.