如何在Linux中复制隐藏的(以点开头)文件和子目录?


10

如何将文件夹A中的隐藏文件和隐藏子目录(以点开头的文件)复制到文件夹B?例如,如果我具有以下结构:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

我只想将A中的隐藏文件和隐藏子目录复制到B:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

我已经尝试过以下命令:cp A/.* B来自另一个超级用户问题。但是,它不会复制子目录。也尝试过cp -r A/.* B,但是它复制了,.所以我以A的精确副本结尾(包括普通文件)。任何帮助表示赞赏。

Answers:


16

例如,只要您只寻找A级别的隐藏文件和文件夹,而不想要

A/b/.hidden

要复制,您应该可以使用以下代码:

cp -r A/.[^.]* B

这基本上意味着复制以a开头的任何内容,.然后复制除a以外的任何字符,然后.过滤掉...

编辑:由于Asker尚未表明他要保留任何所有权,日期等,所以从cp命令中删除了-p。


这适用于问题中给出的示例文件和目录名称,但是问题文本为“隐藏的文件和隐藏的子目录(以点开头的文件和目录)”,并且此答案将找不到名称以“。”开头的文件和目录。2点; 例如..c
斯科特

那是一个极端的情况,但是仍然是一个合理的关注。我没有考虑过。您可以通过切换到来解决此问题,.*[^.]但随后您会错过以结尾的文件.。我认为您确实需要进行扩展才能真正解决所有情况。
2014年

4

这个问题A/.*是存在的目录.A也匹配模式。

您可以打开扩展的glob模式并使用以下命令:

shopt -s extglob
cp -r A/.!(?(.)) B    

它匹配文件名以点开头且第二个字符既不是点也不是点(?(。)不匹配或点,!(...)不匹配,即!(?(。))匹配的所有文件比什么都没有。


+1为正确答案。请注意,.!(@(|.))(AFAICT)等同于上述内容,(IMNSHO)更加清晰,并且只增加了一个字符。
斯科特

3

对于这种情况,建议使用find而不是cp这样:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

基本语法如下所示:

  • find A/ -type ffind目录中A/类型为文件的项目(而不是目录)…
  • -maxdepth 1 -name '.*'maxdepth表示1个目录中的a,其name开头为.
  • -exec cp -p {} B/ \;:并且一旦找到这些文件,带有标志execcp命令-p将保留从源({})到目的地的日期/时间B/

我喜欢使用maxdepth添加控制层的方式,因此我不会意外复制整个文件系统。但是请随意删除它。


0
 for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
  • find A -type d 提供A中仅目录的递归列表
  • grep -E "\." 用点过滤目录(即:隐藏目录)
  • 这里需要-E选项,因为没有它,它也意味着“当前目录”
  • 反斜杠是为了避免在正则表达式下“任何字符”的含义
  • cp -r 递归复制

我已经为A创建了文件和文件夹结构,并在Git Bash中执行了命令(我现在还没有使用Linux),并且它可以正常工作。


如果文件的名称或路径中包含空格或特殊字符,则此操作会中断。
slhck 2014年

感谢您的注意:)实际上,我只限于@gaboroncancio的“测试案例”。如果您可以给我其他测试电池,我可能会尝试改善(当然,如果您愿意,可以自己编辑此响应或创建新答案来改善它)
malarres 2014年

您可以将点文件简单地放在一个名为的文件夹中A B,然后由于扩展到,它会意外动作cp -r A B/.dotfile B。一般建议根本不要解析findls输出。如果您使用,find还应该使用其自己的选项而不是进行过滤grep,如果您将find输出通过管道-print0传输到其他地方,请使用或直接调用所需的命令。请参阅find 手册
slhck 2014年

甚至更一般而言,在处理文件时,如其他答案所述(尽管通常需要extglob设置它们),使用外壳程序glob最安全。
slhck 2014年

感谢您的链接。find然后让我们离开解析。
malarres 2014年

0

或者,如果第二个字符是字母数字(source),则可以使用此其他命令:

cp -r A/.[a-zA-Z0-9]* B

这适用于问题中给出的示例文件和目录名称,但是问题文本为“隐藏的文件和隐藏的子目录(以点开头的文件和目录)”,并且此答案将找不到名称以“。”开头的文件和目录。点和特殊字符;例如.@foo..c
斯科特

这就是为什么我指出如果第二个字符是字母数字字符也可以使用的原因。;)
gaboroncancio 2014年
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.