我一直在寻找,但我找不到任何对我有用的东西。 我是shell脚本和zsh的新手,我试图在一个目录中循环遍历一堆文件。
因此,假设我有一个非常特定格式.su
的5000个文件,只能由特定软件处理。我需要将这些文件与一个名为suop2
的子程序相加,并将它们成对求和。
我正在寻找一种巧妙的方法来汇总所有文件并将它们合并到一个文件中。考虑到我可以使用suop2
一次总结2个文件。文件看起来像,
*tt.su
我一直在考虑使用for
循环,但我不确定如何处理在总结其中2个后创建的中间文件。
任何人都知道如何做到这一点?任何建议都将非常感激。
谢谢
答案 0 :(得分:0)
据我所知,你有一个程序“添加”两个文件以产生“总和”,你想要总结所有文件。因此,保持一个工作总计,并一次添加一个文件到该总数。
第一个文件是原始总数。然后一次添加一个文件。
我使用两个临时文件:一个包含部分和,另一个包含下一个和。如果suop2
能够合并到现有文件中,则可能不需要这样做。使用临时文件进行部分求和的原因是最终结果文件(total.su
)不是用部分和创建的,这样如果这个文件存在,你知道它是' sa表示某个时间点所有文件的有效总和。
#!/bin/zsh
# Exit on any error
set -e
# Clean up temporary files on error
trap 'rm -f partial_sum.su next_sum.su' EXIT INT TERM
# Collect the files
files=(*tt.su(N))
if ((!#files)); then
echo 'No files to add!'
exit 2
fi
# Set up the initial partial sum
cp files[0] partial_sum.su
shift files
# Process all the other files
for input in $files; do
suop2 $input partial_sum.su >next_sum.su
mv next_sum.su partial_sum.su
done
# We have a result
mv partial_sum.su total.su
答案 1 :(得分:-1)
您只需要一个中间文件来累积结果。我假设suop2
像这样运行
suop2 file1 file2 > answer
但您可以根据其他用例调整答案。
files=( *tt.su )
# Assume at least 2 files
suop2 "${files[@]:0:2}" > answer
for f in "${files[@]:2}"; do
suop2 "$answer" "$f" > tmp && mv tmp answer
done
如果suop2
接受一个标识,比如一个空文件,它会更简单,当添加到另一个文件时,它会返回该文件。
touch answer
for f in *tt.su; do
suop2 answer $f > tmp && mv tmp answer
done