加速使用多个find命令的bash脚本

时间:2012-11-09 23:11:36

标签: 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'"

我不确定是否只需要一次调用find就会比拥有所有这些分开的命令更快,但我这样做是因为删除某些类型的文件或添加新文件更简单。

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

5 个答案:

答案 0 :(得分:6)

如果git支持在一个命令中添加多个文件,那么您可以做的最简单的事情就是使用+的{​​{1}}后缀:

-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 {} + 之前的\(来保护他们免受特殊外壳的影响。您也可以使用引号:)'('

')'有一些复杂的选项,一个人必须在学习它们并熟悉它们时遇到一些麻烦但是多年来我通过能够卷起一个来节省了很多精力复杂的find命令,而不是通过grep和awk等过滤文件名。

我目前最喜欢的扫描maven / subversion java项目而忽略不感兴趣文件的模式之一是:

find

答案 1 :(得分:4)

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

这意味着您只扫描一次目录结构,这是加速“多个find s”的主要方式;用'one'替换'multiple'。 +是对find的POSIX 2008添加,但使其更像xargs。如果您无法使用,请考虑使用-printxargs(或者,如果您的姓名中可能包含空格,并且您拥有GNU findxargs ,然后是-print0xargs -0,但是如果你有它们,你(可能 - 但看到评论)也有+符号。

答案 2 :(得分:2)

如果你

  • 有Bash 4
  • 仅按名称搜索(不按其他条件搜索)

您也可以使用它:

shopt -s globstar
git add **/*.{js,html,css,py,txt,jpg,sh}

<小时/> 注意:

  1. 在文件名扩展之前执行大括号扩展,因此这相当于编写

    git add **/*.js **/*.html etc...
    
  2. globstar通过关键字**启用递归文件名扩展。

答案 3 :(得分:2)

git add命令可以在没有任何其他shell脚本的情况下执行此操作。

git add -- '*.js' '*.html' '*.css' ...

答案 4 :(得分:1)

这可能会更快:

F='\.js$|\.html$|\.css$|\.py$|\.txt$|\.jpg$|\.sh$'
find . | egrep $F | xargs git add
如果您希望文件名中包含空格或其他特殊字符,请

或其中的某些变体。