I want to ignore all hidden files, but especially .git and .svn ones when searching (and later replacing) files, not I have found that the most basic way to exclude such hidden files described in many online tutorials doesn't work here.
find . -not -name ".*"
will also print hidden files.
The script I'm trying to write is
replace() {
if [ -n "$3" ]; then expr="-name \"$3\""; fi
find . -type f \( $expr -not -name ".*" \) -exec echo sed -i \'s/$1/$2/g\' {} \;
unset expr
}
The thing is -not -name ".*"
does match all files and directories that start with anything but "." - but it doesn't prune them from the search, so you'll get matches from inside hidden directories. To prune paths use -prune
, i.e.:
find $PWD -name ".*" -prune -o -print
(I use $PWD
because otherwise the start of the search "." would also be pruned and there would be no output)
correct version
replace() {
if [ -n "$3" ]; then expr=-name\ $3; fi
find $PWD -name '.*' -prune -o $expr -type f -exec sed -i s/$1/$2/g {} \;
unset expr
}