2017-02-24 141 views
1

我有一个/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 

它可以在目录和子目录中的所有文件复制到目标,但我不能过滤的文件类型。

有没有另一种方法可以实现我想要的?

+1

'*但我无法过滤文件类型*'当然可以,'find'就是很棒的。 – Biffen

+0

我用'man find',它显示我''type f'有关,但是我看到'f常规文件',它没有告诉我如何将它与'-name'结合起来。什么是阅读手册的正确方法? –

+0

'man find'是阅读手册的好方法。结合'-type'和'-name'只需一个接一个:'find。 -type f -name'* .jpg'' – Biffen

回答

3

您可以使用find以获得所需的源文件,然后使用cp-exec谓词find内将文件复制到所需的目的地。与GNU cp

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

POSIX-LY:

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

谢谢。它岩石 –

1

随着globstarextglob壳选项:

shopt -s globstar extglob 
cp dir1/**/*[email protected](txt|jpg) dir2 

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

对于有些偶然的情况下,有任何的dir1没有.jpg.txt文件,而是一个名为**dir1子目录称为*[email protected](txt|jpg)文件,你可能还需要设置failglob外壳选项,命令不是如果glob不匹配–而不是复制不太可能的文件,则执行。


globstar在击4.0的溶液中加入,并因此不能用于该附带的Mac OS(3.2)标准的击。

+0

第一个声明做什么?我试图'人设置',它告诉我没有'set'的手册。我执行了你的陈述,它告诉我'set -s'是无效的。 –

+1

这是一个愚蠢的错字,应该是'shopt'! –

相关问题