I need to copy all the .class files from server to local with all dir reserved. e.g. server:/usr/some/unknown/number/of/sub/folders/me.class
will be /usr/project/backup/some/unknown/number/of/sub/folders/me.class
the problem is, there are many other useless files such as .svn-base files that i don't want. how can i filter them so I only scp
.class files?
views:
578answers:
5Copy your source folder to
somedir
:cp -r
srcdir
somedir
Remove all unneeded files:
find somedir -name '.svn' -exec rm -rf {} \+
launch scp from
somedir
There is no feature in scp to filter files. For "advanced" stuff like this, I recommend using rsync:
rsync -a --exclude '*.svn' server:dir .
Recent versions of rsync tunnel over an ssh connection automatically by default.
I'd probably recommend using something like rsync for this due to its include and exclude flags, e.g:-
rsync -rav -e ssh --include='*.class' --exclude='*' \
server:/usr/some/unknown/number/of/sub/folders/ \
/usr/project/backup/some/unknown/number/of/sub/folders/
Since you can scp
you should be ok to ssh
,
either script the following or login and execute...
# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)
return back (logout) to local server and scp
,
# from the local machine
cd /usr/project/backup/some/unknown/number/of/sub/folders
scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 .
tar xfj pack.tar.bz2
If you find the $(find ...)
is too long for your tar change to,
find . -type f -name *.class | xargs tar cfj pack.tar.bz2
Finally, since you are keeping it in /usr/project/backup/
,
why bother extraction? Just keep the tar.bz2
, with maybe a date+time stamp.