假设你创建了新的文件夹(或将要创建一个文件夹),并希望在创建文件夹后将文件复制到该文件夹
mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>
,这将把所有的文件/文件夹从/etc/skel
递归复制到第一行已经创建的文件夹中。
不要指定文件:
cp -r /etc/skel /home/user
(注意/home/user
必须是不存在的,否则会创建/home/user/skel
)。
正确的操作方法是使用-T (--no-target-directory)
选项,递归复制文件夹(没有后缀斜线、星号等),例如:
cp -rT /etc/skel /home/user
这将把/etc/skel
的内容复制到/home/user
中(包括隐藏文件),如果/home/user
不存在,则创建-T
文件夹;但是,如果/etc/skel
文件夹不存在,则/home/user/skel
选项会阻止/home/user
的内容复制到新的&007文件夹中。
bash
本身就有一个很好的解决方案,它有一个shell option
,你可以cp
,mv
等:
shopt -s dotglob # for considering dot files (turn on dot files)
,
shopt -u dotglob # for don't considering dot files (turn off dot files)
以上的解决方案是bash
的标准
注:***
shopt # without argument show status of all shell options
-u # abbrivation of unset
-s # abbrivation of set
使用rsync:
rsync -rtv source_folder/ destination_folder/
rsync
很好,但另一个选择:
cp -a src/ dst/
来自主帮:
-a, --archive
same as -dR --preserve=all
-d same as --no-dereference --preserve=links
-R, -r, --recursive
copy directories recursively
cp -r /etc/skel/{.,}* /home/user
{.,}*
表达式包括了所有的文件和目录(也是以点开头的)。
你可以使用rsync.
rsync -aP ./from/dir/ /some/other/directory/
rsync -aP ./from/dir/ username@remotehost:/some/other/directory/
你甚至可以复制到ssh
-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.
你可以使用各种标志。-a, –archive # archive (-rlptgoD)
&001 Rsync man page
如果你的源目录和目标目录的名称相同,即使目标目录存在,你只需输入:
cp -R /etc/skel /home/
这将把/etc/skel目录复制到/home/,包括隐藏的文件和目录。
当我需要复制所有文件(包括.
文件)到目标目录保留权限时,我的解决方法是。(如果已经存在就覆盖)
yes | cp -rvp /source/directory /destination/directory/
&001
yes
是自动覆盖目标文件,r
递归,v
动词,p
保留权限。
注意,源路径不是以/
结尾(所以所有的文件/目录和.文件都被复制了)
目标目录以/
*结尾,因为我们是把源文件夹的内容作为一个整体放到目标目录。
请注意,有一个命令行技巧(至少在sh、bash和ksh中有效)。只需在from目录后面加上一个斜线。这将会把from目录的内容倒入to目录中(讽刺的是,我在使用rsync_的时候第一次知道这个技巧)。
我看到cp并不总是复制隐藏的文件,如果你想要一个在所有linux/unix方言中都能正常工作的命令,你可以尝试使用以下命令:
cd /etc/skel
find | cpio -pdumv /home/user
至少从K3b 2.0.3开始,当目录被添加到项目中时,会弹出一个问题框,问你是否要包含隐藏文件……….还有一个问题会弹出,问你是否要包含链接。很好的东西!