2016-09-18 36 views
-1

我想基本上用这个shell脚本来做的事情是让用户通过控制台输入一个目录,并将输出结果放在该目录内的所有.c文件以及其中的子目录(这些文件是复制到脚本的当前位置)。如何在给定目录输入的情况下复制某些文件扩展名?

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

然而,当我运行该脚本(SH test.sh DIRA)它将所有的1 $目录中的子目录的,什么也没有在他们里面(甚至没有.c文件)。我想输出不是目录,而只是.c文件。

所以,如果我在当前目录中的ls应该出来一堆文件,如:file.c file1.c file2.c NOT dir1 dir2 dir3。

+1

SO是用于编程问题,而不是Unix技术支持。 – Barmar

回答

0

你应该简单地忽略--exclude '*'。因为它稍后在命令行中发生,所以在候选文件成功通过--include '*.c'测试并导致任何文件被拒绝之后应用它。

所以,简单地复制给定的子树内的任何.c文件在当前目录层次结构使用纯:

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

编辑:

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

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

find "$1" -name '*.c' -print0 | xargs -0 -I'{}' cp {} . 
+0

正在发送和检索数据,但.c文件未移至任何位置。我可能错误地使用了rsync?我应该使用-cp而不是-va吗? – Orcka

相关问题