2011-02-02 7 views
1

私はbashプログラミングの初心者です。私はファイルをソートする$ -n $ 1の結果を/ etc/*のサイズで と表示したい。問題は、最終検索時に、処理されたディレクトリとファイルの数を知る必要があることです。どのように最大ファイルサイズとカウントファイルによる再帰的ソートですか?

私は、次のコード作曲:私は実行時にエラーがある

#!/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

エラーを掲載してください。ここからは見えません。 –

答えて

0
  1. これは#!/bin/bashではなく、#!/bash/binです。

  2. 私はsortの引数が何であるかわかりません。たぶん、sort -r -nを意味するのでしょうか?

  3. あなたの頭の使い方が間違っています。 headファイルの引数を与えると、標準入力を無視するので、一般的には何かをパイプしてファイル引数を与えるのはエラーです。それ以外に、 "$ 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

ルビ実装の表示は、bashの問題を解決するのに役立つものではありません。 –

+0

彼が最初にbashを使用していない場合、bashの問題は発生しません。だから、なぜRuby(または他の言葉であれ)を使ってbashの問題を解決できないのでしょうか?あなたは奇妙な質問をしました。 – kurumi

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の結果を表示することです。このプロセスでは、何個のファイルとディレクトリに、 の検索を行ったディレクトリが含まれているかを知る必要があります。

関連する問題