bash - 在 BASH 脚本中按顺序读取文件

标签 bash sorting file grep

所以我有一个 bash 脚本,它可以 greps 一系列子目录,查找包含特定字符串的文件,然后打印文件总数和目录总数以查找该字符串的出现次数。代码如下。

  for dir in $(find * -type d); do
  echo "directory: $dir" >> $OUT
  for f in $(find $dir/* -type f); do
    echo -n "$(basename $f) " >> $OUT
    grep -c -h $1 $f >> $OUT
  done
  echo -n "directory total: " >> $OUT
  grep -c -h $1 $dir/*.* | awk '{SUM += $1} END {print SUM}' >> $OUT
  done

执行此操作时,如果我读入 10 个文件,它会在文本文件中将它们列为 file1.txt、file10.txt、file2.txt 等...

有什么方法可以让它打印 file1.txt、file2.txt、file3.txt 等并让第 10 个文件实际按顺序列出?

我是 BASH 的新手,所以我想知道是否有人对此有所了解。非常感谢任何帮助。是的,这些文件的字面意思是 file1.txt、file2.txt 等。这主要是为了让我自己熟悉 BASH 脚本。

最佳答案

find -type d | while read -r dir
do
    echo "directory: $dir"
    find "$dir" -maxdepth 1 -type f | sort --version-sort | while read -r f
    do
        echo -n "$(basename "$f") "
        grep -c -h "$1" "$f"
    done
    grep -c -h "$1" "$dir/*" | awk -F: '{SUM += $1} END {print "directory total:", SUM}'
done > "$OUT"
  • 将重定向移动到循环的末尾
  • 如果文件名包含空格,请使用 while read 而不是 for(如果需要,可以采取其他措施来防止出现一些不太常见的奇数字符)
  • 也引用你的变量来保护空白
  • 使用 -maxdepth 1 和内部 find 避免重叠重复
  • 使用sort --version-sort 以您想要的顺序获取文件名
  • AWK 可以在打印总数的同时打印文本
  • 字段分隔符需要设置为冒号
  • 您可以使用 echo -n "${f##*/} " 而不是 echo -n "$(basename "$f") " >

关于bash - 在 BASH 脚本中按顺序读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5013953/

相关文章:

bash - 如何逐行执行bash脚本?

perl - 你如何爬上 bash 脚本的父目录结构?

java - 对混合列表中仅一类的对象进行排序

algorithm - 计算这个选择排序实现的大 O 复杂度?

python - 如何将字典列表保存到文件中?

java - file.getTotalSpace() 返回实际值的两倍

linux - 替换 bash 脚本中的现有文件

bash - 将命令的结果存储在变量中

java - 如何按时间和相似度对列表进行排序?

新的/修改的/删除的文件的 GIT 列表