假设我有如下:
Folder A
C1
file a
A2
Folder B
C1
B2
file b
B3
我想要的是合并这两个文件夹,这会给我:
Folder C
C1
A2
B2
B3
请注意,我没有写file a
和file b
。我只想合并架构。每个存储库包含不同的文件,我不希望将它们添加到合并目录中。其结果是,mv Folder\ A/* Folder\ B
还不够。
你们有办法做到这一点吗?
答案1
好吧,你可以有find
exec mkdir
。
cd /A/
find -type d -exec mkdir -p /C/{} \;
或者,如果结构是平坦的,如您的示例所示,没有find
cd /A/
for dir in */
do
mkdir -p /C/"$dir"
done
在这两种情况下对于 又是相同的cd /B/
。
答案2
如果您只想创建相同的目录结构,您可以调用find
遍历每个现有目录树并mkdir
在每个子目录上使用正确的参数进行调用。调用mkdir -p
以静默跳过已存在的目录。
cd 'Folder A'
find . -type d -exec mkdir -p '/path/to/Folder C/{} '\;
cd 'Folder B'
find . -type d -exec mkdir -p '/path/to/Folder C/{} '\;
在 zsh 中,假设Folder A
、 、Folder B
是Folder C
同一目录的子目录:
mkdir -p Folder\ [AB]/**/*(/e\''REPLY=Folder\ C/${REPLY#*/}'\')
如果您想使用文件权限重现目录层次结构,您可以调用 rsync,并为其提供一个仅包含目录而不包含常规文件的过滤器。确保/
在源目录末尾包含 ,以便将其内容直接复制到下面,而/path/to/Folder C
无需创建/path/to/Folder C/path/to/Folder A
等等。
rsync -a --include='*/' --exclude='*' '/path/to/Folder A/' '/path/to/Folder B/' '/path/to/Folder C'
答案3
我会这样做:
$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}
细节
这将生成“文件夹 A”和“文件夹 B”下的子目录列表,该列表如下所示:
Folder A/A2
Folder A/C1
Folder B/B2
Folder B/B3
Folder B/C1
通过此命令管道输出sed
将删除“Folder ..”位:
sed 's#[^/]\+/##'
结果是这样的:
A2
C1
B2
B3
C1
笔记:上面sed
是从左侧看,找到所有不是斜线的东西,直到第一个斜线,然后这些字符被替换为任何内容,本质上是删除它们。
此时你只需要mkdir
在“Folder C”目录下,这样我们就可以用来xargs
完成这个重复的任务:
xargs -I{} mkdir -p "Folder C"/{}
这表示将 as 中的每个参数{}
替换为以下命令中存在相应的{}
.
例子
样本数据:
$ tree Folder\ {A,B,C}
Folder A
|-- A2
`-- C1
`-- filea
Folder B
|-- B2
| `-- fileb
|-- B3
`-- C1
Folder C
笔记:看到“文件夹C”为空即可启动。
现在我们运行我们的命令:
$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}
我们剩下以下内容:
$ tree Folder\ C
Folder C
|-- A2
|-- B2
|-- B3
`-- C1