Confused about grep and the * wildcard
You're confusing the different meaning of *
for Shell Filename Expansion and Posix Basic Regex.
In Regex, *
is the quantifier for the character in front of it, so h*
means 0 or more occurrences of h
. If you want "any number of any character", use .*
.
grep '*'
would look for literal *
as there is nothing in front of it to quantify, while grep '**'
would like for 0 or more occurrences of *
, so everything will fit as 0 occurrences of something will always fit.
Anyways, you should rather use find
with argument -path "*/flash/*"
instead of grep
the output of find
.
find . -not -path './flash_drive_data*' | grep "./*flash*"
The thing here is that grep
uses regular expressions, while find -path
uses shell glob style pattern matches. The asterisk has a different meaning in those two.
The regular expression ./*flash*
matches first any character (.
), then zero or more slashes (/*
), then a literal string flas
, then any number (zero or more) of h
characters. 3/flas
matches that (with zero times h
), and so would e.g. reflash
(with zero times /
).
You could just use grep flash
instead, given that it matches anywhere in the input, so leading and tailing "match anything" parts are unnecessary.
Or use find -path './*flash*' -and -not -path './flash_drive_data*'
When I replaced
grep "*flash*"
with justgrep "*"
, I got [no matches].
Since the asterisk means "any number of the previous atom", it's not really well defined here. grep
interprets that as a literal asterisk, but really it should be an error.
However, when I ran:
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +
I was getting output including things like:
./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/
so
flash_drive_data
files were being included.
Note that tar
stores files recursively, and the first output of that find
is .
for the current directory, so everything will be stored. You may want to use ! -type d
with find
to exclude directories from the output, or (better), look at the -exclude=PATTERN
options to tar
.