linux - 复制文件并保留目录结构

标签 linux bash find copy

这是我必须做的:找到目录 src(或其子目录)中的所有文件,并在它们的名称中包含 str 并将它们复制到 dest 保留子目录结构。例如,我有包含 foo.txt 的目录 dir1 和还包含 foo.txt 的子目录 subdir .运行我的脚本后(使用 str=txtdest=dir2)dir2 应该包含 foo.txt子目录/foo.txt。到目前为止,我想出了这段代码:

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

除了它在 dir2 中创建 dir1 并且所需的文件在 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

关于linux - 复制文件并保留目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044456/

相关文章:

linux - 如何通过 Linux shell 学习你的方式

django - 使用 bash 脚本删除 django 的数据库设置

python - 如何检查字符串中的字符是否为字母? (Python)

bash - 如何使用 Find-exec 和 Tr 处理大量文件

linux - Bash 函数中的 Cd

python - 如何使用python动态地将方法导出到dbus,而不需要静态装饰器?

c++ - 部署不起作用且可执行扩展

linux - 如何从容器访问主机端口(使用 ssh -R 绑定(bind))?

linux - 每行计算文件中的唯一元素

python - igraph python 检查顶点是否存在