递归复制隐藏文件 - Linux

Zif*_*fre 20 linux files copy cp

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

cp -R .* directory
Run Code Online (Sandbox Code Playgroud)

但它也识别...递归复制所有非隐藏文件。有没有办法让 cp 忽略...

Aln*_*tak 19

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

cp -R .[a-zA-Z0-9]* directory
Run Code Online (Sandbox Code Playgroud)

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

其他模式匹配可用 ( .??*, .[^.]*) - 请参阅评论

  • .[^.]* 会抓住一切 (6认同)
  • ...除了以两个句号开头的内容。 (3认同)

pjz*_*pjz 16

我最喜欢移动目录一般是:

tar cvf - . | (cd /dest/dir; tar xvf -)
Run Code Online (Sandbox Code Playgroud)

它将当前目录压缩到标准输出,然后将其通过管道传输到子shell,在解压缩标准输入之前,先将 cd 转到目标目录。简单、直接、可扩展 - 考虑将 () 替换为另一台机器的 ssh 时会发生什么。或者要回答您的问题,您可能会这样做:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
Run Code Online (Sandbox Code Playgroud)

  • 好建议。我有一些改进:1) 使用 `cd /dest/dir && tar xvf -`。如果目标目录中有拼写错误,“&&”将阻止您在源目录上乱写乱画。2) 您只需要在其中一个 tar 命令上使用 tar `v` 标志(或两者都不需要)。 (2认同)

Ama*_*rus 15

你可以使用rsync.

rsync -a ./ /some/other/directory/
Run Code Online (Sandbox Code Playgroud)

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


Mih*_*şan 11

我恳求你,一步从平原上的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/ \;
Run Code Online (Sandbox Code Playgroud)

分步说明:

  • -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 解释。在该命令行中,您需要使用{}您希望当前遇到的匹配的名称结束的位置。由于 shell 也可能会误解花括号,因此您应该将它们放在撇号中,如'{}'. 在这种情况下我们要执行的命令是cp -a '{}' /path/to/destination/dir/(-a 表示存档,在子目录中递归,将符号链接复制为链接,并保留权限和扩展属性,/path/to/destination/dir/显然是目标目录的名称 - 替换它。)

所以,用简单的英语,这个find命令行是这样说的:

从 /path/to/toplevel/dir/ 开始。不要进入任何子目录。查找名称以点开头的所有目录、文件和符号链接。对于您找到的每一个,将其复制到 /path/to/destination/dir/ 保留性质、权限和扩展属性。


Pau*_*lin 8

我一直使用 .??* 来查找隐藏文件而不会得到“.” 和 ”..”。不过,它可能会错过“.a”或其他东西,但我从未有过其中一个。