linux - 如何在给定目录输入的情况下复制某些文件扩展名?

标签 linux shell

我基本上想用这个 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/

相关文章:

shell - 从 shell 中的两行中选择不同的值

http - 如何评估来自 bash/shell 脚本的 http 响应代码?

linux - Linux上的TCP文件在哪里

linux - 内存泄漏和 Apache

linux - 尽管包含符号,perf 也不在注释中显示源代码

java - 如何将 windows 批处理文件转换为 mac sh 文件?

bash - 如果这些 Perl 命令在粘贴到 shell 中时被解释为 Bash 命令,是否有害?

linux - 获取执行 bash 脚本的负载、cpu 使用率和时间

php - 查找/检测/格式化周围文件中使用的 GetText 字符串

linux - Git Install Script 如何输入shell命令