所以我有一个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脚本。
答案 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
按照您想要的顺序获取文件名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
显然,这对我所拥有的文件名非常具体,但了解更多信息是一件好事。感谢