所以我有一个 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/