复制文件并保留目录结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复制文件并保留目录结构相关的知识,希望对你有一定的参考价值。

这就是我要做的事情:查找目录src(或其子目录)中的所有文件,并在其名称中包含str,并将它们复制到dest,保留子目录结构。例如,我有目录dir1,其中包含foo.txt和子目录subdir,其中也包含foo.txt。在运行我的脚本(与str=txtdest=dir2)后,dir2应该计算foo.txtsubdir/foo.txt。到目前为止,我已经提出了这个代码:

while read -r line; do
    cp --parents $line $dest
done <<< "$(find $src -name "*$str*")"

几乎完成这项工作,除了它在dir1内部创建dir2并且所需的文件在dir2/dir1内。我也尝试使用find的-exec选项,但没有得到更好的结果。

答案

IIUC,这可以用find ... -exec完成。假设我们有以下目录:

$ tree
.
└── src
    ├── dir1
    │   └── yet_another_file_src
    └── file_src

2 directories, 2 files

我们可以将包含*src*的所有文件复制到/tmp/copy-here,如下所示:

$ find . -type f -name "*src*" -exec sh -c 'echo mkdir -p /tmp/copy-here/$(dirname {})' ; -exec sh -c 'echo cp {} /tmp/copy-here/$(dirname {})' ;
mkdir -p /tmp/copy-here/./src
cp ./src/file_src /tmp/copy-here/./src
mkdir -p /tmp/copy-here/./src/dir1
cp ./src/dir1/yet_another_file_src /tmp/copy-here/./src/dir1

请注意,我使用echo而不是真正运行此命令 - 读取输出并确保这是您想要实现的。如果您确定这将是您想要的,只需删除echo,如下所示:

$ find . -type f -name "*src*" -exec sh -c 'mkdir -p /tmp/copy-here/$(dirname {})' ; -exec sh -c 'cp {} /tmp/copy-here/$(dirname {})' ;
$ tree /tmp/copy-here
/tmp/copy-here
└── src
    ├── dir1
    │   └── yet_another_file_src
    └── file_src

2 directories, 2 files

编辑:

当然,你总是可以使用rsync

$ rsync -avz --include "*/"  --include="*src*" --exclude="*" "$PWD"  /tmp/copy-here

以上是关于复制文件并保留目录结构的主要内容,如果未能解决你的问题,请参考以下文章

powershell Quick Powershell脚本用于复制文件并使用文件类型过滤保留文件夹结构

powershell Quick Powershell脚本用于复制文件并使用文件类型过滤保留文件夹结构

压缩来自不同文件夹的文件,保留目录结构

什么是DNA的弥散性复制?有全保留复制么?它们与半保留复制有什么区别

复制并粘贴我的 xib 文件并保留参考

试图在 Android 中复制 SQLite 数据库并得到“没有这样的文件或目录”