Find With Exclude Directory
Hey all,
I’m trying to do a find of all files with the phrase ‘varnish’ in the name, but want to exclude a user home directory called
/usr/local/digitalplatform.
Here’s what I was able to come up with:
find / -path ‘/usr/local/digitalplatform/*’ -prune -o -name “*varnish*”
Which results in this:
[root@uszmpwsls014lb ~]# find / -path ‘/usr/local/digitalplatform/*’ -prune
-o -name “*varnish*” | grep digitalplatform
/usr/local/digitalplatform/.bash_logout
/usr/local/digitalplatform/varnish-2.1.5.tar.gz
/usr/local/digitalplatform/.viminfo
/usr/local/digitalplatform/.ssh
/usr/local/digitalplatform/varnish-1360.tar.gz
/usr/local/digitalplatform/.emacs
/usr/local/digitalplatform/varnishncsa-init
/usr/local/digitalplatform/varnish-sysconfig-stg
/usr/local/digitalplatform/memcached-1.4.7.tar.gz
/usr/local/digitalplatform/.bash_profile
/usr/local/digitalplatform/.mozilla
/usr/local/digitalplatform/.subversion
/usr/local/digitalplatform/.bashrc
/usr/local/digitalplatform/.zshrc
/usr/local/digitalplatform/varnish-sysconfig
/usr/local/digitalplatform/default.vcl
/usr/local/digitalplatform/1360-apache-stage.tar.gz
/usr/local/digitalplatform/.bash_history
/usr/local/digitalplatform/memcached-1.4.7
/usr/local/digitalplatform/httpd.conf
/usr/local/digitalplatform/varnish-2.1.5
/usr/local/digitalplatform/varnish_reload_vcl
/usr/local/digitalplatform/varnish-prod.tar.gz
/usr/local/digitalplatform/varnish-init
/usr/local/digitalplatform/1360-stage-apache.tar.gz
I’d like to know what I’m doing wrong, and how I can best achieve the desired results?
Thanks Tim
11 thoughts on - Find With Exclude Directory
Just grep it out.
find . -print | grep -v digitalplatform
-v excludes
So:
find / -print | grep -v digitalplatform | grep varnish
Thanks. But what if I want to turn that statement into one that will delete everything it finds? I need to preserve the contents of that directory.
As in : find / -path ‘/usr/local/digitalplatform/*’ -prune -o -name
“*varnish*” -exec rm -rfv {} \;
I’m thinking the grep -v would be a visual thing, but the above statement would delete everything including the varnish files in the digitalplatform directory.
find / -print | grep -v digitalplatform | grep varnish | xargs rm
But test this first – you don’t want to remove anything by accident.
find / -path /usr/local/digitalplatform -prune -name \*varnish\* doesn’t work?
Hal & Jack
Both are perfect! Thanks
[root@uszmpwsls014lb ~]# find / -print | grep -v digitalplatform | grep varnish
/var/lib/varnish
/var/lib/varnish/uszmpwsls014lb
/var/lib/varnish/uszmpwsls014lb/_.vsl
/var/lib/varnish/varnish_storage.bin
/usr/lib64/libvarnish.so.1
/usr/lib64/libvarnishapi.so.1.0.0
/usr/lib64/libvarnishcompat.so.1.0.0
/usr/lib64/libvarnishcompat.so.1
/usr/lib64/libvarnishapi.so.1
/usr/lib64/libvarnish.so.1.0.0
/usr/share/doc/varnish-libs-2.0.6
/usr/share/doc/varnish-libs-2.0.6/LICENSE
[root@uszmpwsls014lb ~]# find / -name “*varnish*” | sed
‘/digitalplatform$/d’ | head -5
find: /proc/4604: No such file or directory
/var/lib/varnish
/var/lib/varnish/varnish_storage.bin
/usr/lib64/libvarnish.so.1
/usr/lib64/libvarnishapi.so.1.0.0
/usr/lib64/libvarnishcompat.so.1.0.0
Brian, no that doesn’t work. It returns nothing.
[root@uszmpwsls014lb ~]# find / -path /usr/local/digitalplatform -prune
-name \*varnish\*
[root@uszmpwsls014lb ~]#
But that’s ok I think I’m all set with the above options.
Thanks!
Tim
Try
find / -path /usr/local/digitalplatform -prune -o name ‘*varnish*’ -print
Without the explicit -print, find will implicitly add one e.g
find / \( -path …. -o -name … \) -print
it might work reasonably for this particular case, but you should note the limitations of such an approach. specifically this would exclude both
/path/you/want/to/ignore/digitalplatform/varnish and
/path/you/want/to/find/digitalplatform/varnish
I’d also suggest using find / -name varnish, dropping the second grep and possibly using anchors with egrep to be very specific (e.g. | egrep
-v “^/ignore/this/path|^/ignore/another/path”
Why not copy the directory elsewhere, then delete the rest and move it back? You’d take a copy of it anyway, if it is important, right?
Cheers,
Cliff
try something along the lines of:
find / -regex ‘.*varnish.*’ ! -regex ‘/usr/local/digitalplatform/.*’
don’t forget to escape that exclamation point if typing on bash.
—
Billy Crook • Network and Security Administrator • RiskAnalytics, LLC