我想将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
目录的实际名称(以及folder1
、folder2
等的名称)不包含src
。
答案3
您只需添加 -r 即可复制所有子文件夹和文件,-r 将以递归方式执行此操作
cp -r source/folderX/src dest/folderX