2011-02-02 58 views
1

我是bash編程的初學者。我想按大小在/ etc/*中顯示排序文件 的head-n $ 1結果。問題是,在最終搜索時,我必須知道有多少個目錄和文件已經處理。如何按最大文件大小和計數文件遞歸排序?

我撰寫下面的代碼:

#!/bash/bin 
let countF=0; 
let countD=0; 
for file in $(du -sk /etc/* |sort +0n | head $1); do 
if [ -f "file" ] then 
    echo $file; 
    let countF=countF+1; 
else if [ -d "file" ] then 
    let countD=countD+1; 
fi 
done 
echo $countF 
echo $countD 

我在執行錯誤。如何使用du找到,因爲我必須遞歸搜索?

+0

請發佈錯誤。我們無法從這裏看到他們。 – 2011-02-02 04:23:42

回答

0
  1. 這是#!/bin/bash不是#!/bash/bin

  2. 我不知道sort應該是什麼論點。也許你的意思是sort -r -n

  3. 您對頭部的使用是錯誤的。給頭文件參數會導致它忽略它的標準輸入,所以一般來說,這是一個錯誤,既管道頭,並給它一個文件參數。除此之外,「$ 1」是指腳本的第一個參數。你可能意思是head -n 1,或者你是否試圖將可處理的行數從參數設置爲腳本:head -n"$1"

  4. 在您的if測試中,您沒有引用循環變量:它應該爲"$file",而不是"file"

  5. 不是說bash語法分析器關心的,但你應該嘗試縮進。

1
#!/bin/bash  # directory and program reversed 
let countF=0  # semicolon not needed (several more places) 
let countD=0 
while read -r file; do 
    if [ -f "$file" ]; then  # missing dollar sign and semicolon 
     echo $file 
     let countF=countF+1 # could also be: let countF++ 
    else if [ -d "$file" ]; then  # missing dollar sign and semicolon 
     let countD=countD+1 
    fi 
done < <(du -sk /etc/* |sort +0n | head $1) # see below 
echo $countF 
echo $countD 

改變從for循環到while允許它在文件名的情況下正常工作,包含空格。

我不確定你有什麼版本的排序,但我會接受你的說法,說明論證是正確的。

0

紅寶石(1.9+)

#!/usr/bin/env ruby  

fc=0 
dc=0 
a=Dir["/etc/*"].inject([]) do |x,f| 
    fc+=1 if File.file?(f) 
    dc+=1 if File.directory?(f) 
    x<<f 
end 
puts a.sort 
puts "number of files: #{fc}" 
puts "number of directories: #{dc}" 
+0

顯示ruby實現不會幫助解決他/她的bash問題。 – 2011-02-02 10:02:56

0
#!/bin/bash  # directory and program reversed 
let countF=0  # semicolon not needed (several more places) 
let countD=0 
while read -r file; do 
    if [ -f "$file" ]; then  # missing dollar sign and semicolon 
     echo $file 
     let countF=countF+1 # could also be: let countF++ 
    else if [ -d "$file" ]; then  # missing dollar sign and semicolon 
     let countD=countD+1 
    fi 
done < <(du -sk /etc/* |sort +0n | head $1) # see below 
echo $countF 
echo $countD 

我試過的,而不是文件變量在/ etc/*,但我沒有看到的結果。這個想法是按照目錄和子目錄的大小對所有文件進行排序,並顯示文件大小爲 的$ 1結果。在這個過程中,我必須知道有多少個文件和目錄包含我執行搜索的目錄 。