合并两个目录而不复制文件

合并两个目录而不复制文件

假设我有如下:

Folder A
    C1
        file a
    A2

Folder B
     C1
     B2
         file b
     B3

我想要的是合并这两个文件夹,这会给我:

Folder C
    C1
    A2
    B2
    B3

请注意,我没有写file afile b。我只想合并架构。每个存储库包含不同的文件,我不希望将它们添加到合并目录中。其结果是,mv Folder\ A/* Folder\ B还不够。

你们有办法做到这一点吗?

答案1

好吧,你可以有findexec 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 BFolder 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

相关内容