【问题标题】:Pass "file name" from a text file to a command line where each line of a file is file name将“文件名”从文本文件传递到命令行,其中文件的每一行都是文件名
【发布时间】:2013-03-10 00:52:11
【问题描述】:

我正在运行以下代码

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

标签: perl git bash repository


【解决方案1】:

如果您想要每个文件的总数:

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)是一个变量。
  • 糟糕,您说的是“存储库”,而不是“目录”。固定。
  • 基于您可以为 git log 提供目录这一事实大大简化了答案。
【解决方案2】:

除了使用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 命令。)

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多