我尝试用这个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。
答案 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 {} .