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

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

如何将文件夹 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 的精确副本(包括正常文件)。任何帮助都值得感激。

答案1

只要你只寻找 A 级的隐藏文件和文件夹,并且不想,例如

A/b/.hidden

要复制,你应该可以使用这个:

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

它的基本意思是复制以 a 开头的任何内容.,然后复制除 a 之外的任何字符,.过滤...

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

答案2

问题在于其中A/.*存在与模式匹配的目录。.A

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

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

它匹配名称以点开头并且第二个字符既不是点也不是空的文件(?(。)匹配空或点,!(...)对其进行取反,即!(?(。))匹配除空或点之外的所有内容)。

答案3

对于这种情况建议使用find代替cp像这样:

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

基本语法分解如下:

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

我喜欢使用它maxdepth来添加一层控制,这样我就不会意外复制整个文件系统。但您可以随意删除它。

答案4

另外,如果第二个字符是字母数字,则可以使用另一个命令(来源):

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

相关内容