首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找(和计数)重复的JS/Java文件

查找(和计数)重复的JS/Java文件
EN

Code Review用户
提问于 2018-03-22 12:38:14
回答 1查看 31关注 0票数 2

我有下面的脚本,它需要几分钟才能输出。

代码语言:javascript
复制
printf "\nDuplicate JS Filenames...\n"
(
  find . -name '*.js' -type f -exec basename {} \; | sort | uniq -c | grep -v "^[ \t]*1 ";
  echo "$(find . -type f -name '*.js' | wc -l) JS files in search directory";
  echo "$(find . -name '*.js' -type f -exec basename {} \; | sort | uniq -c | grep -v "^[ \t]*1 " | wc -l) duplicates found";
)

printf "\nDuplicate Java Filenames...\n"
(
  find . -name '*.java' -type f -exec basename {} \; | sort | uniq -c | grep -v "^[ \t]*1 ";
  echo "$(find . -type f -name '*.java' | wc -l) Java files in search directory";
  echo "$(find . -name '*.java' -type f -exec basename {} \; | sort | uniq -c | grep -v "^[ \t]*1 " | wc -l) duplicates found";
)

我知道我有几次提出了同样的要求或类似的要求。

我如何优化它,也许已经是基本命令了--我很惊讶发现花费了这么长的时间,或者是由于排序、uniq和grep?

EN

回答 1

Code Review用户

回答已采纳

发布于 2018-03-22 14:10:00

除了三次运行本质上相同的find命令之外,主要问题是对于每个找到的文件都运行一个单独的basename实例。

如果您使用的是GNU find (使用find --version验证),则可以找到直接打印basenames的方法:

代码语言:javascript
复制
find . -name '*.js' -type f -printf '%f\n'

在我的系统中,当在一个目录中运行大约200000个文件时,这比调用basename快900倍。

如果您的系统不附带GNU find (例如,MacOS、OpenBSD、FreeBSD),并且不想安装它(软件包通常称为findutils),则可以使用sed来执行与basename相同的操作,但对所有找到的文件同时执行以下操作:

代码语言:javascript
复制
find . -name '*.js' -type f | sed 's@.*/@@'

在我的系统中,这只比使用-printf稍微慢一些。

如果希望减少运行find的次数,只需将输出保存在一个变量中:

代码语言:javascript
复制
filelist="$(find . -name '*.js' -type f -printf '%f\n' | sort)"
echo "$filelist" | uniq -c | grep -v "^[ \t]*1 ";
echo "$(echo "$filelist" | wc -l) JS files in search directory";
echo "$(echo "$filelist" | uniq -c | grep -v "^[ \t]*1 " | wc -l) duplicates found"

请注意,在bash上,您需要在$filelist周围放置双引号,这样换行符就不会被压缩。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/190200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档