[shell] Ho dei dubbi su un esercizio di ricerca stringa

Stato
Discussione chiusa ad ulteriori risposte.

Milly

Utente Silver
18 Marzo 2008
1
1
0
60
Utilizzando i comandi Unix, si scriva un file comandi in shell di Bourne che preveda i seguenti parametri di invocazione:

cercaFile stringa dir num

dove stringa è una stringa, dir é un nome assoluto di directory e num è un intero.
Il file comandi deve esplorare in modo ricorsivo la directory passata come parametro per ricercare tutti i file che siano leggibili dall’utente, che abbiano estensione “.txtâ€￾ e all’interno dei quali la stringa stringa compaia in almeno num righe.
Al termine delle operazioni, il file comandi deve scrivere a video il nome della directory che contiene il maggior numero di file che soddisfano le condizioni richieste.

Ho dei dubbi su come eseguire il file. Devo creare due file comandi giusto? e non uno unico con cercaFile e cercastringa e inserire il codice che ho scritto sotto e dargli il permesso di esecuzione con chmod u+x nomefile. poi lo eseguo con
sh cercaFile stringa num

ma quando li eseguo mette la linea del codice e scrive cercastringa command not found e non trova /tmp/counter /tmp/max_counter e /tmp/max_dirname, li devo creare io?


********** FILE: cercaFile **********
Codice:
#!/bin/sh
PATH=$PATH:/home/sistop
export PATH

if test $# -ne 3
then
  echo "Errore: numero argomenti"
  exit 1
fi

if ! test -d $2
  then
  echo "Errore: $2 non è una directory"
exit 2
fi

case $2 in
/*) ;;
*) echo "Errore: il percorso $2 non è assoluto"; exit 3;;
esac

if ! test $3 -gt 0
then
  echo "Errore: $3 non è un numero"
  exit 4
fi
> /tmp/max_counter
> /tmp/max_dirname

cercastringa $*
echo "La directory con il maggior numero di file è: `cat /tmp/max_dirname`"
rm -f /tmp/max_counter
rm -f /tmp/max_dirname


********** FILE: cercastringa **********
Codice:
#!/bin/sh
cd $2
> /tmp/counter
# per evitare eventuali messaggi di errore usare
# `ls *.txt 2> /dev/null` al posto di *.txt
# nella riga seguente
for i in *.txt
do
  if test -f $i -a -r $i -a `grep -c $1 $i` -ge $3
  then
    echo $i >> /tmp/counter
  fi
done

if test `wc -l < /tmp/counter` -gt `wc -l < /tmp/max_counter`
then
  rm -f /tmp/max_counter
  mv /tmp/counter /tmp/max_counter
  echo `pwd` > /tmp/max_dirname
fi

rm -f /tmp/counter
for d in *
do
  if test -d $d
  then
    cercastringa $1 $d $3
  fi
done

EDIT by Malex: il tag code esiste, usiamolo

EDIT2: e visto che c'è anche il "Rsolto,", sostituiamolo a quello "Problema"
 
Codice:
#!/bin/bash

string=$1
dir=$2
num=$3

matches=$(grep -c $string $dir/*.txt)  #numero di match della stringa $string nei file .txt della directory $dir

if (($matches >= $num)); then
	echo "enough matches: $matches matches of the string '$string' in dir $dir"
else
	echo "not enough matches: $matches matches of the string '$string' in dir $dir"
fi

Si devono aggiungere i controlli di file esistente e se è leggibile dall'utente.
Applicalo a più directory ed estrai sempre con if quella col maggior numero di matches.

Ah il tuo errore era che cercavi in directory che non esistevano (devi crearle prima se vuoi testare e metterci dentro alcuni .txt col testo che cerchi).
E poi quando vai a fare l'if in cercastringa il comando "cercastringa $1 $d $3" non esiste, semplicemente perchè sta cercando di eseguire se stesso (e anche male perchè avresti dovuto fare ./cercastringa o sh cercastringa).
 
ok, grazie, ma il programma non l'ho scritto io, ma il mio prof e io volevo testarlo per vedere come funzionava, ma non riuscivo a farlo andare e non capivo il perchè.
 
Stato
Discussione chiusa ad ulteriori risposte.