将文本文件中的“文件名”传递到命令行,其中文件的每一行都是文件名。

4
我正在运行以下代码。
git log --pretty=format: --numstat -- SOMEFILENAME |
   perl -ane '$i += ($F[0]-$F[1]); END{print "changed: $i\n"}' \
      >> random.txt

这个程序的作用是,它会将一个名为"SOMEFILENAME"的文件中添加和删除行的总数保存到一个名为"random.txt"的文本文件中。

我需要在存储库中的每个文件上运行此程序,而这些文件非常多。有没有简单的方法来完成这个任务?


你可以使用 find ... exec - fedorqui
2个回答

2
如果您想要每个文件的总计:
git log --pretty=format: --numstat |
   perl -ane'
      $c{$F[2]} += $F[0]-$F[1] if $F[2];
      END { print "$_\t$c{$_}\n" for sort keys %c }
   ' >random.txt

如果您想要一个单一的总数:

git log --pretty=format: --numstat |
   perl -ane'
      $c += $F[0]-$F[1];
      END { print "$c\n" }
   ' >random.txt

他们各自的输出如下:
.gitignore      22
Build.PL        48
CHANGES.txt     0
Changes 25
LICENSE 132
LICENSE.txt     0
MANIFEST        18
MANIFEST.SKIP   9
README.txt      67
TODO.txt        1
lib/feature/qw_comments.pm      129
lib/feature/qw_comments.xs      250
t/00_load.t     13
t/01_basic.t    85
t/02_pragma.t   56
t/03_line_numbers.t     37
t/04_errors.t   177
t/05-unicode.t  39
t/devel-pod-coverage.t  26
t/pod.t 17

并且

1151

  • 是通配符。$i(固定为$n)是一个变量。
- ikegami
糟糕,你说的是“仓库”,不是“目录”。已修复。 - ikegami
基于您可以向git log提供目录的事实,这是一个大大简化的答案。 - ikegami

0

不必使用find,您可以使用名称.(表示当前目录)让git直接提供所有文件。以下是使用awk打印每个文件统计信息的版本:

git log --pretty=format: --numstat -- . |
awk '
    NF == 3 {changed[$3] += $1 - $2}
    END { for (name in changed) { printf("%s: %d changed\n", name, changed[name]); } }
'

这是一个更短的程序,它只会输出一行总的变化:

git log --pretty=format: --numstat -- . |
awk '
    NF == 3 {changed += $1 - $2}
    END { printf("%d changed\n", changed); }
'

(NF == 3 是为了解决 git 在输出中似乎会打印出多余的空白行的问题。我没有尝试找到更好的 git 命令。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接