如何将目录及其子目录中的所有文件复制到另一个目录?
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 /dir2
和 cp -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/ \;
使用 globstar
1 和 extglob
shell 选项:
shopt -s globstar extglob
cp dir1/**/*.@(txt|jpg) dir2
**/
表达式匹配零个或多个目录或子目录,所以你从dir1
的整个子树中获取文件; @(txt|jpg)
是匹配 txt
或 jpg
的扩展模式。
对于 dir1
中没有 .jpg
和 .txt
文件但在 [=] 的子目录中有一个名为 *.@(txt|jpg)
的文件的不太可能的情况14=] 称为 **
,您可能还想设置 failglob
shell 选项,以便在 glob 不匹配任何内容时不执行该命令,而不是复制不太可能的文件。
1 globstar
是在 Bash 4.0 中添加的,因此不适用于 [=41= 标配的 Bash ] OS (3.2).
我有一个/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 /dir2
和 cp -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/ \;
使用 globstar
1 和 extglob
shell 选项:
shopt -s globstar extglob
cp dir1/**/*.@(txt|jpg) dir2
**/
表达式匹配零个或多个目录或子目录,所以你从dir1
的整个子树中获取文件; @(txt|jpg)
是匹配 txt
或 jpg
的扩展模式。
对于 dir1
中没有 .jpg
和 .txt
文件但在 [=] 的子目录中有一个名为 *.@(txt|jpg)
的文件的不太可能的情况14=] 称为 **
,您可能还想设置 failglob
shell 选项,以便在 glob 不匹配任何内容时不执行该命令,而不是复制不太可能的文件。
1 globstar
是在 Bash 4.0 中添加的,因此不适用于 [=41= 标配的 Bash ] OS (3.2).