如何使用find命令并保留目录结构来复制位于多个位置的目录的内容?

时间:2019-01-09 09:05:51

标签: bash

我在一个父目录accdb下的多个目录下都有一个名为dist的文件夹。我想在保留代码结构的同时为所有目录复制accdb的内容

我成功地通过以下方式制作了递归文件夹结构:

cd ~/dist; find . -name "accdb" -type d -exec mkdir -p -- ~/acc_trial/{} \; 

但是我无法复制accdb的内容。此命令只是使结构一直到目录accdb

我尝试了

find . -name "accdb" -type d -exec mkdir -p -- ~/acc_trial/{} \ && cp -r {} ~/acc_trial/{} \;

我得到一个错误:

  

查找:`-exec'缺少参数

1 个答案:

答案 0 :(得分:0)

我不知道仅使用find表达式是否可以实现,我很确定这是不可能的。此外,您还必须考虑到,如果在一个accdb文件夹中有一个名为accdb的子文件夹,您可能会得到一个错误,这就是为什么在我制作的脚本中我决定使用rsync的原因:

#!/bin/bash
DEST='/home/corronx/provisional/destination_dir'
#Clean destination directory, PLEASE BE CAREFUL IT MUST BE A REMOVABLE DIRECTORY
rm -rf $DEST/*

FIND='test'
LOOK_PATH='/home/corronx/provisional'
FILES=($(find . -type d -name $FIND))


for ((i=0; i<${#FILES[@]};i++))
do
        #Remove first character .
        FILES[$i]=${FILES[$i]:1:${#FILES[$i]}}
        #Create directories in destination path
        mkdir -p $DEST${FILES[$i]}
        rsync -aHz --delete ${FILES[$i]:1:${#FILES[$i]}}/ $DEST${FILES[$i]}
        echo $i
done

说明

首先,我建议您在脚本中使用完整路径,因为脚本内部的rm -rf表达式非常危险(如果要在运行脚本之前注释该行并删除目标文件夹)。

DEST =目标路径。

FIND =您正在寻找的子文件夹名称。

LOOK_PATH =您要执行查找的路径

我创建了一个名为FILES的数组,其中包含所有返回find表达式的文件夹,之后我仅创建目标目录并运行rsync复制文件,因此我使用rsync是因为我认为最好是在子目录中使用相同的名称。

请注意rm -rf表达式,如果未设置DEST,则将删除计算机中的所有内容