如何用cp复制包含隐藏文件和隐藏目录及其内容?


388

如何完全cp -r复制目录中的所有文件和目录

要求:

  • 包括隐藏文件和隐藏目录。
  • 是一个带有标志的命令,包含上述内容。
  • 根本不需要依赖模式匹配。

我的丑陋,但工作,黑客是:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

如何在没有模式匹配的情况下在一个命令中完成所有操作?我需要使用什么旗帜?


1
这里有更多的答案,虽然它们看起来不那么好; serverfault.com/questions/3154 / ...
Roel Van de Paar 2016年

请Eleven81考虑更改@bruno pereira给出的答案,因为它避免了创建新文件夹。如果没有,请将此评论作为对新读者的警告,以检查其他(投票最多的)答案。TX。
Beco博士2016年

Answers:


265

不要指定文件:

cp -r /etc/skel /home/user

(注意,/home/user必须不存在,否则它将创建/home/user/skel。)


58
是否有可能使用,如果类似的事情/home/user/skel 确实存在吗?
bradley.ayers 2011年

@ bradley.ayers我认为可以复制到一个临时子目录然后将它们移动到较高级别(因为在同一个驱动器中移动很快)。不太理想,但比其他解决方案更短。
HalilÖzgür2013年

7
@ bradley.ayers布鲁诺在下面的回答解决了你的问题
马克

1
这个解决方案对我不起作用。它没有复制隐藏文件。我正在使用CentOS 6.5版。@ Bruno的解决方案成功了。
Technext 2016年

2
在ubuntu / debian下,这将目录'skel'放在目标目录中,而不是skel中的递归文件。使用-T(无目标)以下正确使用。(-rT递归)
bshea

463

假设您创建了新文件夹(或将要创建一个),并希望在创建文件夹后将文件复制到该文件夹

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

这会将所有文件/文件夹从中递归复制/etc/skel到第一行创建的现有文件夹中。


5
如果我没有弄错,这并没有复制隐藏/点文件。
HalilÖzgür2013年

34
对我来说效果很好。注意'。' 对它起作用至关重要。
马克

12
它有效,但是,为什么?在手册中找不到对此的引用。
Julien Palard 2014年

5
我认为它有效,因为通常情况下,这将创建一个新文件夹,其中包含第一个参数中最后一个文件夹的名称。但是,由于该名称.,此行为将要求它创建一个已存在的目录,因此它只是跳过该步骤。
Zenexer 2014年

27
@Technext bash中的默认globbing不包含以a开头的文件名.,要更改shopt -s dotglob之前需要使用该命令才能包含这些文件。因此*,默认情况下,您要求从此目录递归复制所有可以使用扩展的*文件(默认情况下不包括隐藏文件)。而在另一端,.你使用cp递归复制“这个目录”中的所有内容。
Bruno Pereira 2016年

78

执行此操作的正确方法是使用该-T (--no-target-directory)选项,并递归复制文件夹(不带尾随斜杠,星号等),即:

cp -rT /etc/skel /home/user

这将复制/etc/skel/home/user(包括隐藏文件)的内容,创建文件夹(/home/user如果不存在); 但是,如果文件夹存在,该-T选项可防止将内容/etc/skel复制到新文件/home/user/skel/home/user


3
正确答案。+1
bshea

这确实是正确的答案
Gaetan

这是最好的答案; 它是唯一一个解决问题而不会使问题复杂化的问题
ZaxLofful

正好按预期复制
Chetabahana

当你为一个案例使用正确的cmd标志时,请喜欢它。
Tran Triet

66

bash本身有一个很好的解决方案,它有一个shell option,你可以cpmv等等:

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

2
当您只想复制内容而不在目标内创建新目录时,这很有用。特别是当目标目录是挂载点时。
kaszynek 2013年

3
这真的是最好的答案,并深入到问题的核心..
斯蒂芬

7
这是setoptzsh,以防其他人想知道。
帕特

25

使用rsync:

rsync -rtv source_folder/ destination_folder/


对我来说最好的选择,虽然我使用--progress在整个过程中获得更多反馈。
Edenshaw

4

如果源目录和目标目录具有相同的名称,即使目标目录存在,您只需键入:

cp -R /etc/skel /home/

这会将/ etc / skel目录复制到/ home /,包括隐藏文件和目录。

最后,您可以复制目录并将其重命名为一行:

cp -R /etc/skel /home/ && mv /home/skel /home/user

或者你可以简单地cp -r /etc/skel /home/user用于重命名skeluser...
大卫

这是正确的,只有当/ home / user还不存在时。
Gabriel Hautclocq 2013年

4

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。感谢您提及cp -a
Pinaki Mukherjee

4

你可以使用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.

Rsync手册页


4

最简单的方法是:

cp -r /etc/skel/{.,}* /home/user

表达式{.,}*包括所有文件和目录(也以点开头)。

如果您不想使用上面的表达式,那么您可以使用该cp属性,该属性可以为一个目标文件夹指定多个源:

cp -r /etc/skel/* /etc/skel/.* /home/user

1
这会丢失像..anything...anything等文件.- stackoverflow.com/a/31438355/2351568包含此问题的正确的正则表达式。|| 但无论如何使用shopt -s dotglob仍然是更好的解决方案!
DJCrashdummy

@DJCrashdummy不幸的是,我不明白为什么你引起了你的注意。毕竟,我的解决方案会考虑您撰写的案例。问候
simhumileco

抱歉错误的文字!- 你的答案的问题是,它也会考虑...(这相当于当前及其包含的文件夹)。|| 链接中答案仍然进一步解释了它并提供了解决方案。
DJCrashdummy

2

请注意,有一个命令行招(工程,至少,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

2

我来到这里用Google搜索解决同样的问题,然后我意识到使用find很容易。它的优点不依赖于shell或可能未安装的特殊实用程序。

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

我用尾随斜线尝试了这个技巧,但这对我没有用。


2

当我必须将所有文件(包括.文件)复制保留权限的目标目录时,我解决此问题的方法是:(如果已存在则覆盖)

yes | cp -rvp /source/directory /destination/directory/

yes用于自动覆盖目标文件, r递归, v详细, p保留权限。

请注意,源路径不以a结尾/(因此复制了所有files /目录和。文件)

目标目录结束,/因为我们将源文件夹的内容作为整体放置到目标。


1

我已经看到cp并不总是复制隐藏文件,如果你想要一个似乎适用于所有linux / unix方言的命令,你应该尝试使用:

cd /etc/skel
find | cpio -pdumv /home/user

-2

从至少K3b 2.0.3开始,当目录添加到项目时会弹出一个问题框,询问您是否要包含隐藏文件...还有一个问题,弹出询问包括链接。好东西!


“弹出一个问题框” - 对于shell(CLI)命令?
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.