linux - 加速使用多个查找命令的 bash 脚本

标签 linux performance git bash find

我有一个 bash 脚本,用于将项目的一些文件添加到 git,然后同步该分支,随着文件数量的增加,我注意到脚本变得更慢了,所以我想弄清楚我是否以正确的方式进行。

这是添加文件的脚本部分:

echo "Adding files..."
find . -name '*.js' -exec git add {} \;
find . -name '*.html' -exec git add {} \;
find . -name '*.css' -exec git add {} \;
find . -name '*.py' -exec git add {} \;
find . -name '*.txt' -exec git add {} \;
find . -name '*.jpg' -exec git add {} \;
find . -name '*.sh' -exec git add {} \;

echo "Commit"
git commit -m "'$1'"

我不确定调用一次查找是否比使用所有这些单独的命令更快,但我这样做是为了更简单地删除某些类型的文件或添加新文件。

我真的很感激任何提高效率的建议,以不同的方式使用命令或使用不同的命令是一个完全可以接受的答案。

最佳答案

如果 git 支持在一条命令中添加多个文件,那么最简单的做法就是为 -exec 使用 + 后缀:

find . -name '*.js' -exec git add {} \+

这会收集大量文件并将它们全部传递给一个命令行中的命令。

那么会执行的是:

git add a.js b.js c.js d.js

代替

git add a.js
git add b.js
git add c.js
git add d.js

如果您要处理成百上千个文件,这将对执行时间产生很大影响。

要将所有文件模式组合到单个 find 命令中,请使用 find 的“或”运算符:

find . \( -name '*.js' -o   \
          -name '*.html' -o \
          -name '*.css' -o  \
          -name '*.py' -o   \
          -name '*.txt' -o  \
          -name '*.jpg' -o  \
          -name '*.sh' \) -exec git add {} +

() 之前的\ 是为了保护它们不受特殊shell 含义的影响。您同样可以改用引号:'(', ')'

find 有一些复杂的选项,学习它们并熟悉它们需要一些麻烦,但多年来我已经节省了很多精力,因为我能够完成一个复杂的 find 命令,而不是费力地通过 grep 和 awk 等过滤文件名。

我目前最喜欢的扫描 maven/subversion java 项目同时忽略无趣文件的模式之一是:

find . \( \( \( -iname .svn -o -iname target -o -iname classes \) -type d -prune -false \) -o \( <your filter expression> \) \) -exec grep -li xxx {} +

关于linux - 加速使用多个查找命令的 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13317386/

相关文章:

linux - 如何去除文件名中的特殊字符?

git pull --rebase 因冲突而失败,但 git push 有效

git - 您如何将 AppleScript 脚本置于版本控制之下?

java - 与远程 Mercurial 和 Git http 存储库交互

vb.net - 迭代中的性能和 Linq

javascript - 静态 HTML 或生成动态 HTML |表现

linux - 用于远程复制然后处理文件的Shell脚本

c - 使用 Pthreads 的同步问题

linux - cpupower 实用程序 linux - 如何获取可用频率列表

JavaScript window.scroll 延迟导致异步重绘