对目录树中的所有文件运行命令并将输出放入变量中

对目录树中的所有文件运行命令并将输出放入变量中

我想运行这个 bash 命令:

#!/bin/bash
rep="*"

for f in `ls -R`$rep; do
d='git log '$f'| wc -l'
c=$d
echo $c
done

如何git log myFile | wc -l从 bash 执行命令?

ps:该命令将返回一个数字:git log myFile | wc -l

答案1

如果您想执行命令并获取输出,请使用下面的行

d=`git 日志`

在你的脚本中你必须改变两件事。我有下面正确的脚本

#!/bin/bash
代表=“*”

对于 `ls -R $rep` 中的 f;做
d=`git 日志 $f|厕所-l`
c=$d
回声 $c
完毕

编辑:最初的更正是将引号更改为反引号,以使输出达到 d 变量。另外,$rep 应该在 ls 的反引号内,否则会在最后处理的文件名末尾添加 *。

答案2

我已经回答了你的另一个问题调用 find 的 bash 脚本中的语法错误,所以我不会重复我已经写过的内容我的回答在那里

不解析输出ls。您不需要运行ls来枚举目录中的文件。find如果需要递归到子目录,请使用。

要获取 的输出wc -l,请在命令替换中使用它:$(git log "$f" | wc -l)

请注意,变量名称需要用双引号引起来。始终在变量和命令替换周围使用双引号:"$foo", "$(foo)"。双引号会关闭 shell 对变量值或命令输出的进一步处理:如果没有引号,结果将被拆分为被解释为文件通配符模式的单词。使用单引号时,$符号不会被特殊处理,因此git会看到$f而不是值。

find . -type f -exec sh -c '
  for x in "$@"; do
    c=$(git log "$f" | wc -l)
  done
' _ {} +

使用-exec … {} +代替-exec … {} \;允许每个大批量文件仅调用一次中间 shell,这会更快一些。

由于 bash ≥4,您不需要使用find,您可以使用**语法递归到子目录。

shopt -s globstar
for x in **/*; do
  [ -f "$x" ] || continue  # skip directories and other non-regular files
  git log "$x" | wc -l
done

答案3

据我所知命令:

     git log

将显示所有修订历史。如果这是真的,我猜您正在尝试将内容存储在名为 myfile 的文件中,然后您想要计算文件中的行数。

如果这是您想要的,首先您可以通过以下方式保存历史记录:

     git log>myFile.txt

现在您需要使用 wc -l 查找行数并将其存储在名为 nOfLines.txt 的文件中

所以你必须这样做:

    wc -l<myFile.txt>nOfLines.txt

然后将此文件的内容存储在名为 gitVar 的变量中。

     gitVar=$(cat nOfLines.txt)

您可以使用以下命令查看它是否正常工作:

     echo "$gitVar"

只需将整个内容捆绑在名为“myCommand.sh”的脚本中,使用 chmod a+x 为其授予权限,然后像命令一样从终端运行该脚本。

答案4

我想你想做:

#!/bin/bash
rep="*"

for f in `ls -R`$rep; do
d='git log "$f"| wc -l'
c=$d
echo $c
done

请注意 git 命令周围的双引号而不是单引号。

一个较小的解决方案可能是使用:

echo `git log "$f"| wc -l`

相关内容