如何使cp -r绝对复制目录中的所有文件和目录?

要求:


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

我的丑陋,但有效的方法是:

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


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

评论

尽管它们看起来不太好,但这里有更多答案。 serverfault.com/questions/3154/…

Eleven81,请考虑将接受的答案更改为@bruno pereira给出的答案,因为这样可以避免创建新文件夹。如果不是,请将此评论作为警告,警告新读者也检查其他(投票最多)的答案。 Tx。

如何运行shopt -u dotglob以包含隐藏文件,然后运行cp -rfv / etc / skel / home / user,如果要复制大目录,它还会向您显示进度。

#1 楼

不要指定文件:


cp -r /etc/skel /home/user


(请注意/home/user一定不存在,否则将创建/home/user/skel。)

评论


如果/ home / user / skel存在,是否可以使用类似的东西?

–bradley.ayers
2011年8月24日,2:10

@ bradley.ayers下面的Bruno回答解决了您的问题

–马克
13年8月20日在15:38

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

– Technext
16年1月29日在13:02

在ubuntu / debian下,这会将目录“ skel”放置在目标目录中,而不是将递归的文件放置在skel中。请在下面使用-T(无目标)以正确使用。 (-rT表示递归)

– bshea
17年6月23日15:45



回答7.5年的问题,您可以运行cp -r / etc / skel /。 / home / user避免创建子目录(请注意etc / skel之后的/。)。

– carpeliam
19年3月19日在20:00

#2 楼

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

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


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

评论


如果我没弄错的话,这不会复制隐藏/点文件。

–HalilÖzgür
13年3月16日在9:56

对我来说效果很好。请注意,“。”对它的工作至关重要。

–马克
13年8月20日在15:39

它有效,但是,为什么呢?在手册中找不到对此的引用。

–朱利安·帕拉德(Julien Palard)
2014年1月14日下午13:37

我认为它可行,因为通常情况下,这将在第一个参数中使用最后一个文件夹的名称创建一个新文件夹。但是,由于该名称是。,因此此行为将要求它创建一个已经存在的目录,因此它只是跳过了这一步。

–辛尼泽
14年6月11日在20:07

@Technext bash中的默认通配符不包含以。开头的文件名,以更改您需要先使用shopt -s dotglob命令才能包含这些文件。因此,默认情况下,使用*时,您要从该目录中递归复制所有可以使用*扩展的文件(默认情况下不包括隐藏文件)。而在另一端。您正在使用cp递归复制“此目录”中的所有内容。

–布鲁诺·佩雷拉(Bruno Pereira)
16-2-1在20:39



#3 楼

正确的方法是使用-T (--no-target-directory)选项,然后递归复制文件夹(不带斜杠,星号等),即:

cp -rT /etc/skel /home/user


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

评论


正确答案。 +1

– bshea
17年6月23日在15:47

这确实是正确的答案

–加丹
18年2月27日在16:12

这是一堆最好的答案;它是解决问题而不使问题复杂化的唯一方法

– ZaxLofful
18年9月12日在18:25

完全可以按预期复制

–车臣
19年3月31日在11:01

在一种情况下使用正确的cmd标志时,请喜欢它。

–《 Tran Triet》
19-09-11的3:59

#4 楼

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


评论


当您只想复制内容而不在目的地内创建新目录时,这很有用。特别是当目标目录是安装点时。

–kaszynek
13年11月11日在12:27

如果其他人想知道的话,它是zsh的setopt。

–帕特
2014年12月29日23:18

#5 楼

使用rsync:

rsync -rtv source_folder/ destination_folder/

评论


对我来说是最佳选择,尽管我使用--progress在整个过程中获得更多反馈。

– Edenshaw
19年1月2日于13:06

#6 楼

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 ... src dst或cp ... src / dst /时,cp -r以及cp -a复制隐藏文件。这可能是因为超时改变了。

– Roel Van de Paar
9月8日下午3:52

#7 楼

您可以使用rsync。

rsync -aP ./from/dir/ /some/other/directory/


甚至可以在ssh上复制

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/


有很多标志可以使用:
-a,-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手册页

#8 楼

最简单的方法是:
cp -r /etc/skel/{.,}* /home/user

表达式{.,}*包含所有文件和目录(也以点开头)。
如果不想使用上述表达式,则可以使用cp属性,可以为一个目标文件夹指定多个源:
cp -r /etc/skel/* /home/user


评论


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

– DJCrashdummy
18年9月6日在17:53

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

– simhumileco
'18 Sep 6'在22:30

抱歉,文字错误! -您的答案的问题是,它还会考虑。和..(等效于当前文件夹及其包含的文件夹)。 ||但仍然可以通过链接中的答案进一步解释并提供解决方案。

– DJCrashdummy
18年9月7日在16:23

#9 楼

如果源目录和目标目录具有相同的名称,即使目标目录存在,也可以简单地键入:

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重命名为用户...

–大卫
2013年9月13日12:46



没错,只有/ home / user还不存在。

–加布里埃尔·豪克洛克(Gabriel Hautclocq)
13-10-14在11:52

#10 楼

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

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


我尝试了用斜杠结尾的技巧,但并没有为我工作。

#11 楼

请注意,有一个命令行技巧(至少在sh,bash和ksh中有效):只需在斜杠后缀from目录中即可。这会将from目录的内容倒入to目录(具有讽刺意味的是,我第一次使用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


#12 楼

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

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


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

请注意,源路径未以/结尾(因此,所有文件/目录和。文件都将被复制)。

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

#13 楼

我已经看到cp并不总是复制隐藏文件,并且如果您想要一个似乎可以在所有linux / unix方言中使用的命令,则应尝试使用:

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


#14 楼

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

评论


“弹出的问题框” —对于Shell(CLI)命令?

–斯科特
16 Dec 15'1:02