循环文件 zsh

Loop over files zsh

我一直在搜索,但没有找到适合我的东西。 我对 shell 脚本和 zsh 很陌生,我正在尝试遍历一个目录中的一堆文件。

假设我有 5000 个格式非常特殊的文件 .su,只能由特定软件处理。我需要用一个名为 suop2 的子程序对这些文件求和,该子程序将它们成对求和。 我正在寻找一种巧妙的方法来汇总所有文件并将它们合并到一个文件中。考虑到我一次只能用 suop2 对 2 个文件求和。这些文件看起来像

*tt.su

我一直在考虑使用 for 循环,但我不确定如何处理对其中 2 个求和后创建的中间文件。

有人知道怎么做吗?任何建议将不胜感激。

谢谢

你只需要一个中间文件,来累积结果。我假设 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 接受一个名称,比如一个空文件,当添加到另一个文件时只是 returns 那个文件。

touch answer
for f in *tt.su; do
    suop2 answer $f > tmp && mv tmp answer
done

据我了解,您有一个程序将两个文件“相加”以产生“总和”,并且您想对所有文件求和。因此,请保持一个工作总数,并在该总数中一次添加一个文件。

第一个文件是原来的总数。然后向其中添加文件,一次一个。

我使用了两个临时文件:一个包含部分总和,另一个包含下一个总和。如果 suop2 能够合并到现有文件中,则可能没有必要。为部分和使用临时文件的原因是最终结果文件 (total.su) 不是用部分和创建的,这样如果这个文件存在你就知道它是一个代表所有的有效总和某个时间点的文件。

#!/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