How to copy with cp to include hidden files and hidden directories and their contents?
How can I make cp -r copy absolutely all of the files and directories in a directory
Requirements:
- Include hidden files and hidden directories.
- Be one single command with an flag to include the above.
- Not need to rely on pattern matching at all.
My ugly, but working, hack is:
cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/userHow can I do this all in one command without the pattern matching? What flag do I need to use?
315 Answers
Don't specify the files:
cp -r /etc/skel /home/user
(Note that /home/user must not exist already, or else it will create /home/user/skel.)
Lets say you created the new folder (or are going to create one) and want to copy the files to it after the folder is created
mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>This will copy all files/folder recursively from /etc/skel in to the already existing folder created on the first line.
The correct means of doing this is to use the -T (--no-target-directory) option, and recursively copy the folders (without trailing slashes, asterisks, etc.), i.e.:
cp -rT /etc/skel /home/userThis will copy the contents of /etc/skel to /home/user (including hidden files), creating the folder /home/user if it does not exist; however the -T option prevents the contents of /etc/skel from being copied to a new folder /home/user/skel should the folder /home/user exist.
bash itself has a good solution, it has a shell option, You can cp, mv and so on.:
shopt -s dotglob # for considering dot files (turn on dot files)and
shopt -u dotglob # for don't considering dot files (turn off dot files)Above solution is standard of bash
NOTE:
shopt # without argument show status of all shell options
-u # abbrivation of unset
-s # abbrivation of set 2 Use rsync:
rsync -rtv source_folder/ destination_folder/
rsync is good, but another choice:
cp -a src/ dst/From the main help:
-a, --archive same as -dR --preserve=all -d same as --no-dereference --preserve=links -R, -r, --recursive copy directories recursively 1 The simplest way is:
cp -r /etc/skel/{.,}* /home/userThe expression {.,}* includes all files and directories (also starting with a dot).
If you don't want use above expression, then you can use the cp property, which is the ability to specify multiple sources for one target folder:
cp -r /etc/skel/* /home/user 3 You could use rsync.
rsync -aP ./from/dir/ /some/other/directory/You can even copy over ssh
rsync -aP ./from/dir/ username@remotehost:/some/other/directory/There are various flags you can use: -a, --archive # archive (-rlptgoD)
-r, --recursive
-l, --links # copy symlinks as links
-p, --perms # preserve permissions
-t, --times # preserve times
-g, --group # preserve group
-o, --owner # preserve owner
-D # --devices --specials
--delete # Delete extra files
You may want to add the -P option to your command.
--partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.
-P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted. If your source and target directory have the same name, even if target directory exists, you can simply type:
cp -R /etc/skel /home/This will copy the /etc/skel directory into /home/, including hidden files and directories.
Eventually, you can copy the directory and rename it in a single line :
cp -R /etc/skel /home/ && mv /home/skel /home/user 2 I came here having Googled for a solution to the same problem, then I realized that it's easy to do with find. The advantage it doesn't depend on the shell, or special utilities that may not be installed.
find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;I tried the trick with trailing slash, but that didn't work for me.
1Note that there is a command-line trick (works in, at least, sh, bash, and ksh): Just suffix the from directory with a slash. This will pour the contents of the from directory into the to directory (ironically, I had first learned about this trick when using rsync).
Example:
/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2
/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa
/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa My solution for this problem when I have to copy all the files (including . files) to a target directory retaining the permissions is: (overwrite if already exists)
yes | cp -rvp /source/directory /destination/directory/yes is for automatically overwriting destination files, r recursive, v verbose, p retain permissions.
Notice that the source path is not ending with a / (so all the files/directory and . files are copied)
Destination directory ends with / as we are placing contents of the source folder to destination as a whole.
I have seen that cp does not always copy hidden files and if you would like an command that seems to work across all linux/unix dialects you should try using:
cd /etc/skel
find | cpio -pdumv /home/user To copy files, directories and hidden files from a directory to existing/new directory:
cp -a /etc/skel /home/userCopy to current directory:
cp -a /etc/skel/. . As of at least K3b 2.0.3, there is a question box that pops up when the directory is added to the project, that ask if you want to include hidden files ... there is also a question that pops up to ask about including links. Nice stuff!
1