Jump to content
Sign in to follow this  
Bebe

[Version 5 ] Numărul de linii pentru mai multe fișiere

Recommended Posts

                        Ultimul exemplu susține opțiunile care pot fi transmise de la linia de comandă, de exemplu prin ./loc7.sh -d 1 loc7.sh . Funcția getopts shell este folosită pentru a itera peste toate opțiunile (date în șirul următor) și pentru a atribui opțiunea curentă variabilei name. De obicei este utilizat într-o buclă de timp, pentru a seta variabile de shell care vor fi utilizate ulterior. Folosim o țeavă de pisică și awk pentru a imprima antetul acestui fișier, până la prima linie goală, dacă opțiunea de ajutor este aleasă. 

                    Partea principală a scriptului este o buclă pentru toate argumentele din linia de comandă care nu sunt opționale. În fiecare iterație, $fconține numele fișierului de procesat. Dacă opțiunile datei sunt utilizate pentru a restrânge sfera fișierelor de procesat, folosim datași o declarație if, pentru a compara dacă timpul de modificare a fișierului este în intervalul specificat. Numai în acest caz numărăm liniile ca mai înainte. După buclă, vom tipări numărul total de linii și numărul de fișiere procesate.

Exemplul : Număr linie pe mai multe fișiere


#! / Bin / bash
################################################## ##########################
#
# Utilizare: loc7.sh [opțiuni] fișier ...
#
# Numărați numărul de linii dintr-o listă dată de fișiere.
# Utilizează o buclă pentru toate argumentele.
#
# Opțiuni:
# -h ... mesaj de ajutor
# -dn ... ia în considerare doar fișierele modificate în ultimele n zile
# -wn ... ia în considerare doar fișierele modificate în ultimele n săptămâni
#
# Limitări: 
#. ar trebui să se acorde o singură opțiune; un al doilea învinge
#
################################################## ##########################

ajutor = 0
verb = 0
săptămâni = 0
# valori implicite
zile = 0
m = 1
str = "zile"
getopts "hvd: w:" nume
în timp ce ["$ nume"! = "?" ]; do
  cazul $ nume în
   h) ajutor = 1 ;;   
   v) verb = 1 ;;   
   d) zile = $ OPTARG
      m = $ OPTARG
      str = "zile" ;;
   w) săptămâni = $ OPTARG
      m = $ OPTARG
      str = "săptămâni" ;;
  ESAC 
  getopts "hvd: w:" nume
Terminat

dacă [$ ajutor -eq 1]
 apoi no_of_lines = `cat $ 0 | awk 'ÎNCEPE {n = 0; } \
                                 / ^ $ / {print n; \
                                        Ieșire; } \
                                      {n ++; } ' `
      ecou "` cap - $ no_of_lines $ 0` "
      Ieșire 
Fi

shift $ [$ OPTIND - 1]

dacă [$ # -lt 1]
atunci
  ecou „Utilizare: $ 0 fișier ...”
  iesirea 1
Fi

dacă [$ verb -eq 1]
  apoi ecuați „$ 0 numără liniile de cod” 
Fi

l = 0
n = 0
s = 0
pentru f în $ *
do
  x = `stat -c"% y "$ f`
  # data modificării
  d = `data - data =" $ x "+% y% m% d`
  # data de $ m zile / săptămâni în urmă
  e = `data - data =" $ m $ str acum "+% y% m% d`
  # acum
  z = `data +% y% m% d`
  #echo "Stat: $ x; Acum: $ z; Fișier: $ d; $ m $ str acum: $ e"
  # verifică dacă fișierul este mai recent decât req
  dacă [$ d -ge $ e -a $ d -le $ z] # ToDo: fixați anotimpurile
  atunci 
      # fi verbose dacă am găsit un fișier recent
      dacă [$ verb -eq 1] 
        apoi ecuați „$ f: modificat (mmdd) $ d”
      Fi
      # face numarul de linii
      l = `wc -l $ f | sed 's / ^ \ ([0-9] * \). * $ / \ 1 /' '
      ecou „$ f: $ l”
      # creșterea contoarelor
      n = $ [$ n + 1]
      s = $ [$ s + $ l]
  altfel
      # nu este strict necesar, deoarece este sfârșitul buclei
      continua
  Fi
Terminat

ecuați „$ n fișiere în total, cu $ s în linii în total”

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  


×