cp -r
绝对复制目录中的所有文件和目录?要求:
包括隐藏文件和隐藏目录。
一个带有标志的命令可以包含上面的内容。
根本不需要依赖模式匹配。
我的丑陋,但有效的方法是:
cp -r /etc/skel/* /home/user
cp -r /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
,您可以使用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
评论
当您只想复制内容而不在目的地内创建新目录时,这很有用。特别是当目标目录是安装点时。
–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
评论
尽管它们看起来不太好,但这里有更多答案。 serverfault.com/questions/3154/…Eleven81,请考虑将接受的答案更改为@bruno pereira给出的答案,因为这样可以避免创建新文件夹。如果不是,请将此评论作为警告,警告新读者也检查其他(投票最多)的答案。 Tx。
如何运行shopt -u dotglob以包含隐藏文件,然后运行cp -rfv / etc / skel / home / user,如果要复制大目录,它还会向您显示进度。