我基本上想用这个 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。
最佳答案
您应该简单地省略--排除'*'
。由于它稍后出现在命令行上,因此它在候选文件成功 --include '*.c'
测试后应用,并导致任何文件被拒绝。
因此,为了简单地将给定子树中的任何 .c
文件复制到当前目录的层次结构中,请使用简单的:
rsync -va --include '*.c' "$1" .
编辑:
由于rsync
主要是复制和同步层次结构,因此它不是将层次结构扁平化到单个目录的错误工具。对于此类操作,您将需要一个显式忽略目标端源路径的命令(如普通的 cp )。
例如根据您的情况,您可以使用:
find "$1" -name '*.c' -print0 | xargs -0 -I'{}' cp {} .
关于linux - 如何在给定目录输入的情况下复制某些文件扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39554923/