递归复制隐藏文件-Linux


19

是否有一种简便的方法可以将目录中的所有隐藏文件递归复制到另一个目录?我只想备份主目录中的所有设置文件,而不是普通文件。我试过了:

cp -R .* directory

但它也会识别.并..递归地复制所有未隐藏的文件。有没有办法让cp忽略.和..?


有什么区别-r和-R?
— Chaminda Bandara

Answers:


15

我最喜欢移动目录的地方是:

tar cvf - . | (cd /dest/dir; tar xvf -)

该命令将当前目录暂存到stdout,然后将其通过管道传输到一个子外壳,该子外壳首先将cd传输到目标目录,然后再释放stdin。简单,直接,可扩展-考虑将ssh替换()到另一台计算机时会发生什么。或回答您的问题,您可以这样做:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)

1
谢谢,排除选项正是我所需要的。我已经用其他方法完成了,但是我会保留下来以备将来参考。这看起来确实很灵活(尽管可能更慢)。
— 2009年

1
好建议。我有一些改进:1)使用cd /dest/dir && tar xvf -。该&&会从blatting在源目录,如果你有在目的地输入错误阻止你。2)您只需要在vtar命令之一(或两者都不是)上使用tar 标志。
— 汤姆·萧

很公平。我也以另一种方式对事物进行分组:将远程srcdir复制到此处,执行(cd /src/dir && tar cf - .) | tar xvf -
— pjz 2011年

17

几乎每次都可以通过以下方法解决:

cp -R .[a-zA-Z0-9]* directory

具有一个不以这些字符之一开头的隐藏文件是非常不寻常的。

其他模式匹配可用(.??*,.[^.]*)-查看注释


这只会忽略.-xyz-[]中的内容仅与点后的第一个字符匹配。
— Hamish Downer

6
。[^。] *会抓住一切
— 2009年

1
...除了以两个句点开头的内容。
— falstro

@roe-这也是一个很好的版本
— Alnitak

@mish-是的,我确实在回答中说了很多。
— Alnitak

11

您可以使用rsync。

rsync -a ./ /some/other/directory/

它将复制当前目录的内容(包括点文件,但不包括..)


简单,也适用于隐藏文件夹中的隐藏文件。
— user59183 2010年

对我来说,这是所提供的解决方案中比较混乱且最有效的方法
— palerdot 2013年

不错的解决方案。我还需要它不要跨.git目录复制。添加-C会执行此操作,因此命令变为:rsync -aC ./ /some/other/directory/
— theruss

10

我恳求你,一步从平原上的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 /并保留其性质,权限和扩展属性。


1
找到是有史以来最有用的东西。
— 希尼先生和新安宇先生

1
好答案。虽然我更喜欢-exec ...';' 避免反斜杠意味着此命令将同时在CLI和crontab中都可以使用:))
— kubanczyk,2009年

8

我一直使用。?? *查找隐藏文件而没有得到“。”。和“ ..”。它可能会错过“ .a”之类的东西,但我从来没有一个。


绝对好和整洁:) +1
— falstro

如果有一些“ .a”,我不希望它神秘地失败
— Zifre

我喜欢它,因为如果您知道您没有任何单个字符的隐藏文件,那么键入它的速度就非常快。
— Paul Tomblin,2009年

这必须是最佳答案。它应该被推到顶部。
— 伊本·塞德

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.