如果输入目录,如何复制某些文件扩展名?

时间:2016-09-18 06:45:50

标签: linux shell

我尝试用这个shell脚本基本上做的是让用户通过控制台输入一个目录,输出是该目录中的所有.c文件及其中的子目录(文件)被复制到脚本的当前位置)。

rsync -va --include "*/" --include '*.c' --exclude '*' "$1/" . 

然而,当我运行脚本(sh test.sh DirA)时,它会复制$ 1目录中的所有子目录,其中没有任何内容(甚至不是.c文件)。我希望输出不是目录,而只是.c文件。

因此,如果我在当前目录中,它应该出现一堆文件,如:file.c file1.c file2.c NOT dir1 dir2 dir3。

1 个答案:

答案 0 :(得分:0)

您应该忽略--exclude '*'。正如稍后在命令行中发生的那样,它会在候选文件成功进行--include '*.c'测试后应用,并导致任何文件被拒绝。

因此,为了简单地将给定子树中的任何.c文件复制到当前目录中的层次结构,请使用plain:

rsync -va --include '*.c' "$1" .

<强> 编辑:

由于rsync完全是关于复制和同步层次结构,因此将层次结构展平为单个目录是错误的工具。对于这样的操作,您将需要一个明确忽略目标端源路径的命令(如普通cp)。

E.g。在您的情况下,您可以使用:

find "$1" -name '*.c' -print0 | xargs -0 -I'{}' cp {} .
相关问题