How do I copy recursively like
cp -rf *, but excluding hidden directories (directories starting with .) and their contents?
You could just copy everything with
and then delete hidden directories at the destination with
find -type d -name '.*' -and -not -name '.' -print0 | xargs -0 rm -rf
Alternatively, if you have some advanced tar (e.g. GNU tar), you could try to use tar to exclude some patterns. But I am afraid that is not possible to only exclude hidden directories, but include hidden files.
For example something like this:
tar --exclude=PATTERN -f - -c * | tar -C destination -f - -x
Btw, GNU tar has a zoo of exclude style options. My favourite is
Good options for copying a directory tree except for some files are:
rsync: this is basically cp plus a ton of exclusion possibilities.
rsync -a --exclude='.*' /source/ /destination
pax: it has some exclusion capabilities, and it's in POSIX so should be available everywhere (except that some Linux distributions don't include it in their default installation for some reason).
cd /source && mkdir -p /destination && \ pax -rw -pp -s '!.*/\..*!!' . /destination