![如何在 Linux 中复制隐藏(以点开头)文件和子目录?](https://linux22.com/image/1428094/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E4%B8%AD%E5%A4%8D%E5%88%B6%E9%9A%90%E8%97%8F%EF%BC%88%E4%BB%A5%E7%82%B9%E5%BC%80%E5%A4%B4%EF%BC%89%E6%96%87%E4%BB%B6%E5%92%8C%E5%AD%90%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
如何将文件夹 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 A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
基本语法分解如下:
find A/ -type f
:find
目录中A/
类型为文件(而不是目录)的项目…-maxdepth 1 -name '.*'
: 对于此maxdepth
1 个目录,其name
以 开头.
。-exec cp -p {} B/ \;
:一旦找到这些文件,带有标志的命令exec
将保留从源()到目标的日期/时间。cp
-p
{}
B/
我喜欢使用它maxdepth
来添加一层控制,这样我就不会意外复制整个文件系统。但您可以随意删除它。
答案4
另外,如果第二个字符是字母数字,则可以使用另一个命令(来源):
cp -r A/.[a-zA-Z0-9]* B