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

gab*_*cio 11 linux bash shell command-line

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

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c
Run Code Online (Sandbox Code Playgroud)

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

B/.a
B/.b/
B/.b/somefile
B/.b/.c
Run Code Online (Sandbox Code Playgroud)

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

Omn*_*nce 18

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

A/b/.hidden
Run Code Online (Sandbox Code Playgroud)

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

cp -r A/.[^.]* B
Run Code Online (Sandbox Code Playgroud)

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

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


cho*_*oba 5

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

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

shopt -s extglob
cp -r A/.!(?(.)) B    
Run Code Online (Sandbox Code Playgroud)

它匹配名称以点开头且第二个字符既不是点也不是空的文件( ?(.) 不匹配任何内容或点,!(...) 否定它,即 !(?(.)) 匹配其他所有内容比没有或一个点)。


Gia*_*968 5

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

\n\n
find A/ -type f -maxdepth 1 -name \'.*\' -exec cp -p {} B/ \\;\n
Run Code Online (Sandbox Code Playgroud)\n\n

基本语法如下:

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

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

\n