使用 GNU sed (gsed) 执行 "find" 的 Bash 脚本的输出文件为空
Output file empty for Bash script that does "find" using GNU sed (gsed)
我有很多文件,每个文件都在一个目录中。我的脚本应该:
在文件中查找字符串。假设文件名为 "results",字符串为 "average."
然后将字符串行上的所有其他内容附加到另一个名为 "allResults." 的文件中 运行 脚本之后,文件 "allResults" 应包含与那里一样多的行是 "results" 个文件,例如
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
我有很多文件,每个文件都在一个目录中。我的脚本应该:
在文件中查找字符串。假设文件名为 "results",字符串为 "average."
然后将字符串行上的所有其他内容附加到另一个名为 "allResults." 的文件中 运行 脚本之后,文件 "allResults" 应包含与那里一样多的行是 "results" 个文件,例如
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