如何将目录及其子目录中的所有文件复制到另一个目录?

How to copy all files from a directory and its subdirectories to another dir?

我有一个/dir1,结构是:

./aaa.txt
./bbb.jpg
./subdir1/cccc.doc
./subdir1/eeee.txt
./subdir2/dddd.xls
./subdir2/ffff.jpg

我想将/dir1及其子目录中的所有.txt.jpg复制到/dir2.

通过使用 cp -r /dir1/* /dir2,它将所有文件及其结构复制到 /dir2

通过使用 cp -r /dir1/*.jpg /dir2cp -r /dir1/*.txt /dir2,它不会复制子目录中的 .jpg.txt 文件。

通过使用

for FILE in `find`
do
  cp -f $FILE /dir1/
done

它可以将目录和子目录中的所有文件复制到目的地,但我无法过滤文件类型。

还有其他方法可以达到我想要的效果吗?

您可以使用find获取所需的源文件,然后在find-exec谓词中使用cp将文件复制到所需的目的地.使用 GNU cp:

find /dir1/ -type f \( -name '*.txt' -o -name '*.jpg' \) -exec cp -t /dir2/ {} + 

POSIX-仅:

find /dir1/ -type f \( -name '*.txt' -o -name '*.jpg' \) -exec cp {} /dir2/ \; 

使用 globstar1extglob shell 选项:

shopt -s globstar extglob
cp dir1/**/*.@(txt|jpg) dir2

**/表达式匹配零个或多个目录或子目录,所以你从dir1的整个子树中获取文件; @(txt|jpg) 是匹配 txtjpg 的扩展模式。

对于 dir1 中没有 .jpg.txt 文件但在 [=] 的子目录中有一个名为 *.@(txt|jpg) 的文件的不太可能的情况14=] 称为 **,您可能还想设置 failglob shell 选项,以便在 glob 不匹配任何内容时不执行该命令,而不是复制不太可能的文件。


1 globstar 是在 Bash 4.0 中添加的,因此不适用于 [=41= 标配的 Bash ] OS (3.2).