首页 > 解决方案 > 复制包含列表中单词之一的文件

问题描述

我面前有大量的代码库。在此我想找到包含类定义的文件(路径)并将文件复制到文件夹中。我有一个类名列表(大约 50 个)要查找。

我试过使用grep喜欢

cp $(grep --include=\*.java -rl . -e "class SplashScreen" *) --parents -t ./dest-folder

它可以工作,但是通过代码找到一个类也需要很多时间。我可以编写一个循环脚本,尽管每个类名都需要很长时间,而且我不想为每个类手动执行。

有一个更好的方法吗?

标签: javabashgrep

解决方案


假设您在文件中有list.txt一个类名列表(每行一个类名):

MyClass1
MyClass2
MyInterface1

可以处理这个文件来构建一个正则表达式来选择类名并将其存储到一个变量中:

$ class_names="$(cat list.txt|tr '\n' '#'|sed 's/#/\\|/g')"

grep然后你可以使用或者你可以使用运行你的脚本find

$ cp $(find ./src -type f -name "*.java" -exec grep -l "\(class\|interface\) \($class_names\)" {} +) --parents -t ./mydest-dir

或者,没有临时变量,最终命令可能如下所示:

$ cp $(find ./src -type f -name "*.java" -exec grep -l "\(class\|interface\) \($(cat list.txt|tr '\n' '#'|sed 's/#/\\|/g')\)" {} +) --parents -t ./mydest-dir

要确保成功复制所需的文件,请使用相同的find

$ find ./mydest-dir -type f -name "*.java"

推荐阅读