使用 GNU sed (gsed) 执行 "find" 的 Bash 脚本的输出文件为空

Output file empty for Bash script that does "find" using GNU sed (gsed)

我有很多文件,每个文件都在一个目录中。我的脚本应该:

allResults.txt(我想要的):

Everything on the same line as the string, "average" in directory1/results
Everything on the same line as the string, "average" in directory2/results
Everything on the same line as the string, "average" in directory3/results
...
Everything on the same line as the string, "average" in directory-i/results

我的脚本可以找到我需要的东西。我已经通过在脚本运行时在 "allResults.txt" 上执行 "cat" 以及在 "allResults.txt." 的父目录上执行 "ls -l" 进行检查,即,我可以看到 "find" 在我的屏幕上并且 "allResults.txt" 的大小短暂增加,然后返回到 0。问题是脚本完成后 "allResults.txt" 为空。所以 "find" 的结果不是 appended/added 到 "allResults.txt." 它们被覆盖了。 这是我的脚本(我使用 "gsed"、GNU sed,因为我是 Mac OSX Sierra 用户):

#!/bin/bash

# Loop over all directories, find.
let allsteps=100000
for ((step=0; step <= allsteps; step++)); do
    i=$((step));

    findme="average"
    find ${i}/experiment-1/results.dat -type f -exec gsed -n -i "s/${findme}//p" {} \; >> allResults.txt
done 

请注意,我在这里的示例中使用了“>>”,因为我读到它附加了(这是我想要的——所有文件中与我的 "find" 匹配的所有行的列表),而“>”覆盖。但是,在这两种情况下(当我使用“>”或“>>”时),我最终得到一个空的 allResults.txt 文件。

grep 的默认行为是打印出匹配的行。使用 sed 太过分了。

您也不需要显式循环。事实上,过度循环是程序员倾向于从其他循环很常见的语言中引入的常见比喻。大多数 shell 命令和结构接受多个文件名。

grep average */experiment-1/results.dat > allResults.txt

这样做的好处是输出文件只打开一次,然后一口气写入。

如果您确实有数十万个文件要处理,您可能会遇到命令行长度限制。如果发生这种情况,您可以切换到 find 调用,这将确保不会一次调用带有太多文件的 grep。

find . -name results.dat -exec grep average {} + > allResults.txt