copy recursively except hidden directory

19,831

Solution 1

You could just copy everything with

cp -rf 

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

--exclude-vcs

Solution 2

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
    

Solution 3

alternatively to cp you could use rsync with an --exclude=PATTERN.

Share:
19,831

Related videos on Youtube

uray
Author by

uray

i'am a programmer

Updated on September 17, 2022

Comments

  • uray
    uray almost 2 years

    How do I copy recursively like cp -rf *, but excluding hidden directories (directories starting with .) and their contents?