如何完全cp -r
复制目录中的所有文件和目录
要求:
- 包括隐藏文件和隐藏目录。
- 是一个带有标志的命令,包含上述内容。
- 根本不需要依赖模式匹配。
我的丑陋,但工作,黑客是:
cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user
如何在没有模式匹配的情况下在一个命令中完成所有操作?我需要使用什么旗帜?
如何完全cp -r
复制目录中的所有文件和目录
要求:
我的丑陋,但工作,黑客是:
cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user
如何在没有模式匹配的情况下在一个命令中完成所有操作?我需要使用什么旗帜?
Answers:
不要指定文件:
cp -r /etc/skel /home/user
(注意,/home/user
必须不存在,否则它将创建/home/user/skel
。)
/home/user/skel
确实存在吗?
-T
(无目标)以下正确使用。(-rT
递归)
假设您创建了新文件夹(或将要创建一个),并希望在创建文件夹后将文件复制到该文件夹
mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>
这会将所有文件/文件夹从中递归复制/etc/skel
到第一行创建的现有文件夹中。
.
,此行为将要求它创建一个已存在的目录,因此它只是跳过该步骤。
.
,要更改shopt -s dotglob
之前需要使用该命令才能包含这些文件。因此*
,默认情况下,您要求从此目录递归复制所有可以使用扩展的*
文件(默认情况下不包括隐藏文件)。而在另一端,.
你使用cp递归复制“这个目录”中的所有内容。
执行此操作的正确方法是使用该-T (--no-target-directory)
选项,并递归复制文件夹(不带尾随斜杠,星号等),即:
cp -rT /etc/skel /home/user
这将复制/etc/skel
到/home/user
(包括隐藏文件)的内容,创建文件夹(/home/user
如果不存在); 但是,如果文件夹存在,该-T
选项可防止将内容/etc/skel
复制到新文件/home/user/skel
夹/home/user
。
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
setopt
zsh,以防其他人想知道。
使用rsync:
rsync -rtv source_folder/ destination_folder/
如果源目录和目标目录具有相同的名称,即使目标目录存在,您只需键入:
cp -R /etc/skel /home/
这会将/ etc / skel目录复制到/ home /,包括隐藏文件和目录。
最后,您可以复制目录并将其重命名为一行:
cp -R /etc/skel /home/ && mv /home/skel /home/user
cp -r /etc/skel /home/user
用于重命名skel
为user
...
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
你可以使用rsync。
rsync -aP ./from/dir/ /some/other/directory/
你甚至可以复制ssh
rsync -aP ./from/dir/ username@remotehost:/some/other/directory/
你可以使用各种标志:-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.
cp -r /etc/skel/{.,}* /home/user
表达式{.,}*
包括所有文件和目录(也以点开头)。
如果您不想使用上面的表达式,那么您可以使用该cp
属性,该属性可以为一个目标文件夹指定多个源:
cp -r /etc/skel/* /etc/skel/.* /home/user
..anything
或...anything
等文件.- stackoverflow.com/a/31438355/2351568包含此问题的正确的正则表达式。|| 但无论如何使用shopt -s dotglob
仍然是更好的解决方案!
请注意,有一个命令行招(工程,至少,SH,庆典和KSH):就后缀从目录以斜杠。这会将from目录的内容倒入到目录中(具有讽刺意味的是,我在使用 rsync时首先了解了这个技巧)。
例:
/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
当我必须将所有文件(包括.
文件)复制到保留权限的目标目录时,我解决此问题的方法是:(如果已存在则覆盖)
yes | cp -rvp /source/directory /destination/directory/
yes
用于自动覆盖目标文件,
r
递归,
v
详细,
p
保留权限。
请注意,源路径不以a结尾/
(因此复制了所有files /目录和。文件)
目标目录结束,/
因为我们将源文件夹的内容作为整体放置到目标。
我已经看到cp并不总是复制隐藏文件,如果你想要一个似乎适用于所有linux / unix方言的命令,你应该尝试使用:
cd /etc/skel
find | cpio -pdumv /home/user