在Bash中将目录结构从一个目录复制到另一个目录

在Bash中将目录结构从一个目录复制到另一个目录,bash,Bash,目录结构如下所示 ├── input │   ├── config.ac │   ├── dir1 │   │   ├── image2.png │   │   └── image3.jpg │   ├── dir2 │   └── image1.png ├── main.sh └── output 基本上,我正在尝试运行以下./main.sh输入输出,我希望生成以下内容: ├── input │   ├── config.ac │   ├── dir1 │   │   ├── image2.

目录结构如下所示

├── input
│   ├── config.ac
│   ├── dir1
│   │   ├── image2.png
│   │   └── image3.jpg
│   ├── dir2
│   └── image1.png
├── main.sh
└── output
基本上,我正在尝试运行以下./main.sh输入输出,我希望生成以下内容:

├── input
│   ├── config.ac
│   ├── dir1
│   │   ├── image2.png
│   │   └── image3.jpg
│   ├── dir2
│   └── image1.png
├── main.sh
└── output
    ├── dir1
    │   └── image2.png
    ├── dir2
    └── image1.png
在尝试了诸如find-exec之类的一些东西之后,我一步一步地完成了它。我试图将输入的内部目录结构复制到输出中,同时只复制.png文件而不复制其他文件。 以下是我尝试过的:

for DIR in $1/; do
       mkdir $2/$DIR
       cp $1/$DIR*.png $1/$DIR $2/$DIR
done
这是我的逻辑,for循环将遍历源目录($1)中的每个目录结构,然后在目标目录($2)中生成完全相同的目录。现在,它在当前目录中查找任何.png文件,并将其复制到刚刚在目标中创建的完全相同的对应目录中。 注意,我确实计划稍后在for循环中对文件进行一些转换

这似乎根本不起作用。我得到以下错误:

cp: cannot stat 'input/input/*.png': No such file or directory
cp: cannot stat 'input/input/': No such file or directory

您可能会对
rsync
感到满意:

rsync -a --include '*/' --include '*.png' --exclude '*' input/ output
这将复制所有目录和png文件。如果要查看要复制的内容,请添加
-nv
选项


(请参阅
rsync
versions上的注释。)

您可能会对
rsync
感到满意:

rsync -a --include '*/' --include '*.png' --exclude '*' input/ output
这将复制所有目录和png文件。如果要查看要复制的内容,请添加
-nv
选项


(请参阅
rsync
versions上的注释。)

更改到要从中复制的目录

然后


更改到要从中复制的目录

然后


我最喜欢复制目录树(使用输入/输出结构):


根据需要调整“查找”选项。

复制目录树的我的最爱(使用输入/输出结构):


根据需要调整“查找”选项。

这样可以工作,但是,输出目录现在有一个子文件夹名为/input/Sorry,my bad-您需要对输入使用拖尾
/
,答案中已修复。这样可以工作!我很感激。我只是好奇,是否可以用上面的方法或者使用find和-exec做同样的事情?我不喜欢bash循环(所以我不擅长使用它们)。如果我想采取“艰难的方式”,我会做一些类似于
find input-type d | sed's/^input/output/'| xargs mkdir-p
…的工作,但是,输出目录现在有一个名为/input/Sorry,my bad的子文件夹-您需要对输入使用拖尾
/
,这在答案中得到了修复。这很有效!我很感激。我只是好奇,是否可以用上面的方法或者使用find和-exec做同样的事情?我不喜欢bash循环(所以我不擅长使用它们)。如果我想采取“艰难的方式”,我会做一些类似于
find input-type d|sed's/^input/output/'| xargs mkdir-p
…刚刚注意到关于“计划在for循环中进行处理”的说明,我建议以后再做,例如
find output-name'*.png'.\124; parallel“convert to jpg{}>{.}.jpg”
。我想我以后会在另一个循环中执行。即使它是空的,您是否想要
输出/dir2
?我现在已经整理好了。ThanksJust注意到了关于“计划在for循环中进行处理”的注释,我建议以后再做,例如
find output-name'*.png'| parallel“convert to jpg{}>{.}.jpg”
。我想我以后会在另一个循环中做。你想
output/dir2
,即使它是空的吗?我现在已经整理好了。感谢学校-像我一样:-)不过我更喜欢
cd/other&&tarxf-
+1旧学校-像我一样:-)不过我更喜欢
cd/other&&tar xf-
+1.
cd input
find . | cpio -pdm ../output