Answers:
我最喜欢移动目录的地方是:
tar cvf - . | (cd /dest/dir; tar xvf -)
该命令将当前目录暂存到stdout,然后将其通过管道传输到一个子外壳,该子外壳首先将cd传输到目标目录,然后再释放stdin。简单,直接,可扩展-考虑将ssh替换()到另一台计算机时会发生什么。或回答您的问题,您可以这样做:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
cd /dest/dir && tar xvf -
。该&&
会从blatting在源目录,如果你有在目的地输入错误阻止你。2)您只需要在v
tar命令之一(或两者都不是)上使用tar 标志。
(cd /src/dir && tar cf - .) | tar xvf -
您可以使用rsync
。
rsync -a ./ /some/other/directory/
它将复制当前目录的内容(包括点文件,但不包括..
)
.git
目录复制。添加-C会执行此操作,因此命令变为:rsync -aC ./ /some/other/directory/
我恳求你,一步从平原上的shell扩展离开cp
的命令行-壳扩张的种种啊哈,造成“有趣”的情况(不需要递归和..,空间,非打印的东西,硬链接,符号链接,和find
改为使用。(findutils
包中提供了此包,以防您未安装它-这很奇怪,默认情况下所有发行版都将其安装):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
逐步说明:
-H
将导致find
不遵循符号链接(除非您给它的实际顶级目录名称是符号链接;否则它将跟随。)/path/to/toplevel/dir/
显然,您应该将其替换为托管您要备份的设置文件和目录的目录do路径。-maxdepth 1
将停止find
递归降序到名称以点开头的任何目录。我们不需要递归,cp
它将为我们做到这一点,我们只需要此级别的名称。-name '.*'
告诉find
我们希望所有以点开头的名称。如果POSIXLY_CORRECT
设置了环境变量,它将无法正常工作,但很少(如果有)被设置。这是到目前为止我们指定的第一个匹配条件。a \( ....... \)
是一个括号,后面是一个更复杂的条件(我用.....替换它,下面将对此进行解释。)我们需要对括号进行转义,因为否则它们会被外壳(误)解释,因此,在他们前面的反斜杠,-type d -o -type f -o -type l
是三个条件,它们之间有或。-type d
匹配目录,-type f
匹配常规文件,并-type l
匹配符号链接。您可以选择所需的内容-例如,如果您不想备份设置目录,请省略-type d
(-o
显然位于其后面的位置)。-exec ..... \;
告诉find
每次遇到匹配项时执行一条命令。命令的结尾用分号标记,我们再次需要使用反斜杠转义以避免shell解释。在该命令行中,您需要使用{}
要结束当前遇到的匹配的名称的位置。由于壳可能还会误解花括号,因此您应将其放在撇号中,如所示'{}'
。在这种情况下,我们要执行的命令是cp -a '{}' /path/to/destination/dir/
(-a表示存档,它在子目录中递归,将符号链接复制为链接,并保留权限和扩展属性,并且/path/to/destination/dir/
显然是目标目录的名称-替换它。)
因此,以简单的英语显示,此find
命令行表示:
从/ path / to / toplevel / dir /开始。不要归入任何子目录。查找名称以点开头的所有目录,文件和符号链接。对于发现的每个对象,请将其复制到/ path / to / destination / dir /并保留其性质,权限和扩展属性。
这里有更好的答案; /superuser/61611/how-to-copy-with-cp-to-include-hidden-files-and-hidden-directories-and-their-con
它描述了例如使用shopt进行本机bash解决方案
-r
和-R
?