复制文件并保留目录结构

时间:2017-12-31 17:18:34

标签: linux bash find copy

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

while read -r line; do
    cp --parents $line $dest
done <<< "$(find $src -name "*$str*")"
除了在dir1内创建dir2并且所需文件在dir2/dir1内之外,

几乎完成了这项工作。我也尝试使用find的-exec选项,但没有得到更好的结果。

1 个答案:

答案 0 :(得分:1)

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