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 start with a given prefix and save the list to a text file. Here is an example for the files that do have a given prefix:
find bar_* > Positives.txt
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.
If you're doing subdirectories as well:
find . ! -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
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_
.
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.
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.