2011-02-16 95 views
3

因此,我有一個bash腳本,它會查找一系列子目錄,查找包含某個字符串的文件,然後爲該字符串的出現打印文件總計和目錄總計。代碼如下。在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腳本。

+1

由於這個原因,我通常命名文件`file01.txt`,`file02.txt`,...`file99.txt`。 – 2011-02-16 08:53:36

回答

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##*/} "
0

這些文件按字典順序排序(這就是file10在file1之後的原因)。如果文件名爲file<num>,則更容易 - 您使用sort -k1.5n。在一般情況下,它是棘手 - 會有一些涉及解析,判斷你的情況是一般:)

幾點:

也許你不必find $dir/* -type ffind $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 
+0

謝謝你,這樣的提示太棒了! – 2011-02-16 09:06:32

0

改變這一行:

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

這一行:

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

我相信數字排序不會幫助,因爲密鑰的開頭不是數字。 – 2011-02-16 09:13:10

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 

顯然,這是非常具體的文件名我有,但它是更多地瞭解一件好事。由於