递归复制子文件夹的内容

递归复制子文件夹的内容

我想将src文件夹的内容复制到不同位置的新目录中,该目录具有原始目录的父目录的名称src

下面是我想要实现的目标的一个例子。

输入

source/folder1/src
source/folder2/src
source/folder3/src

输出(所有文件夹都应包含文件夹的内容src

dest/folder1
dest/folder2
dest/folder3

答案1

您可以使用for

for d in /path/to/source/*; do echo mkdir /path/to/dest/"$(basename $d)" && echo cp -rvb -- /path/to/source/"$d"/src/* /path/to/dest/"$(basename $d)"; done

source如果从和的父目录执行此操作dest,则可以使用相对路径:

for d in source/*; do echo mkdir dest/"$(basename $d)" && echo cp -rvb -- "$d"/src/* dest/"$(basename $d)"; done

测试后,删除echo实际复制的文件

for d in source/*; do mkdir dest/"$(basename $d)" && cp -rvb -- "$d"/src/* dest/"$(basename $d)"; done

更具可读性...

for d in /path/to/source/*; do 
  echo mkdir /path/to/dest/"$(basename $d)" && 
  echo cp -rvb -- /path/to/source/"$d"/src/* /path/to/dest/"$(basename $d)"
done

答案2

tar

(cd source; tar c .) | tar x --transform 's:/src::' -C dest
  • cd source; tar c .创建目录的 tar 存档source并将其发送到管道
  • 第二个tar从管道读取该档案,然后
  • 将其提取 ( x) 到dest目录 ( -C dest),
  • 在结果路径上应用sed命令(删除路径中第一次出现的)s:/src::/src

假设source目录的实际名称(以及folder1folder2等的名称)不包含src

答案3

您只需添加 -r 即可复制所有子文件夹和文件,-r 将以递归方式执行此操作

cp -r source/folderX/src dest/folderX

相关内容