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

时间:2011-02-16 08:07:41

标签: bash sorting file grep

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

  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脚本。

4 个答案:

答案 0 :(得分:2)

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 "$(basename "$f") "
  • 代替echo -n "${f##*/} "

答案 1 :(得分:0)

文件按字典顺序排序(这就是file10在file1之后的原因)。如果文件名为file<num>,则更容易 - 您可以使用sort -k1.5n。在一般情况下,它更棘手 - 将涉及一些解析,告诉你的案例是否通用:)

有些观点:

可能您不需要find $dir/* -type f而是find $dir -type f。在前一种情况下,您使用shell的globbing功能。子目录怎么样?

顺便说一下,您可以将其重写为以下内容,以便使用>> $OUT来跳过每一行的垃圾邮件:

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

答案 2 :(得分:0)

更改此行:

for f in $(find $dir/* -type f); do

到这一行:

for f in $(find $dir/* -type f | sort --numeric-sort); do

答案 3 :(得分:0)

所以我想我是在你们的帮助下想出来的,还有一些修修补补。不确定这是不是最好的方法,但我最终得到了这个......

for f in $(find $dir -type f | cut -d. -f1 | cut -d'e' -f3 | sort -n); do
    echo -n "  file$(basename $f).txt: "
    grep -c -h $1 $dir/"file$f"'.txt'
  done

显然,这对我所拥有的文件名非常具体,但了解更多信息是一件好事。感谢