Newsgroup: it.comp.os.linux.sys
Titolo: exit code di find ?

Devo testare l' mtime di un file in uno script.
La prima idea è stata
if find $FILE -mtime +1; then
Mi sono però accorto che quando il file esiste ma non matcha le 
condizioni, l'exit code è comunque nullo, quindi quanto sopra non funziona.
$ find /var/log/messages -mtime +1
$ echo $?
0
$ find /etc/issue -mtime +1
/etc/issue
$ echo $?
0
Premesso che ero convinto di avere usato quanto sopra con successo in un 
altro script (evidentemente mi sbaglio...), ho pensato a questa 
soluzione: è corretta??
if [ -f "$(find $FILE -mtime +$DAYS)" ] ; then
Ciao
Paolo

 if [ -f "$(find $FILE -mtime +$DAYS)" ] ; then
Almeno parzialmente mi auto-rispondo:
http://serverfault.com/questions/225798/find-command-enable-exit-status-to-be-diff-then-0-when-not-match

Paolo ha scritto:

  Direi di no.  Da quanto ricordo, e da quanto ho riscontrato da una
lettura rapida di man find(1), questo comando esce con un codice diverso
da zero solo quando:
1) la riga di comando è sintatticamente errata;
2) è stato fornito un oggetto di confronto (per, ad es., gli switch
-newerXY e -samefile) che non esiste sul filesystem;
3) è stata richiesta la cancellazione di un oggetto sul filesystem
(switch -delete) ma la cancellazione è fallita.
  La stessa pagina man specifica:
TATUS
	find exits with status 0 if all files are processed
	successfully, greater  than  0  if  errors occur.  This is
	deliberately a very broad description, but if the return
	value is non-zero, you should not rely on the correctness
	of the results of find.
  Quindi, anche se find non trova nulla che corrisponde ai criteri
specificati ma non ha avuto problemi ad elaborare la richiesta e ad
accedere agli oggetti del filesystem, il suo codice di ritorno è
comunque zero.
  Ciao,
-- 
Alessandro Selli 
http://alessandro.route-add.net
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.

 
http://serverfault.com/questions/225798/find-command-enable-exit-status-to-be-diff-then-0-when-not-match
Se vogliamo fare filosofia sull'exit status di find, se va
bene così o deve copiare grep mi limito a dire che ci sono
ottime ragioni perché find fa così e grep no; l'anomalia è
grep.
Pero se devi solo verificare l'esistenza di un file allora:
... find $DIRECTORY $FILE -mtime +$DAYS -printf "filefound" -quit ...

 ... find $DIRECTORY $FILE -mtime +$DAYS -printf "filefound" -quit ...
Mi serve una condizione per un if, quindi qualcosa che abbia exit status 
diverso nei due casi;
ad esempio, find $miofile -mtime +1 | grep -qE '.*'
sembra funzionare...
E' un workaround, forse "filosoficamente" è più corretto [ -f ... ]
Grazie :-)

 comunque zero.
Appunto quello era il mio problema iniziale...
Che sembra risolto da un paio di workaround trovati nel frattempo che ho 
postato sopra.
if [ -f "$(find $FILE -mtime +$DAYS)" ] dovrebbe servire proprio a 
"distinguere" i due casi ...
Grazie a te e agli altri :-)

 diverso nei due casi;
Pronto! C'è nessuno in casa? Il comando test serve a questo. 
inserisci il find nel codice di esempio che hai trovato tu stesso:
#!/bin/bash
MYVAR=$(find $DIRECTORY -mtime +$DAYS -printf "filefound" -quit)
if [ -z "$MYVAR" ]; then
    echo Notfound
else
   echo Filefound
fi

 dici ha delle ottime ragioni per fare così?
Innanzi tutto mi scuso per il ritardo con cui scrivo.
Seconda cosa io non capisco la tua risposta. Probabilmente 
c'è stato una incomprensione, probabilmente stiamo parlando
di due cose diverse e probabilmente la colpa è mia poiché non
sono stato sufficientemente chiaro.
I problemi affrontati nel thread sono diversi:
1) Cosa è l'/exit/ /status/, perchè si usa l'/exit/status
     e come si usa l'/exit/startus.
2) Quali sono le convenzioni per l'/exit/ /status/ che usa
    Unix, le convenzioni che usa find e le convenzioni che
    usa grep, perché sono diverse e perché (non) va bene
    così.
3) Perché le convenzioni per l'/exit/ /status/ di Unix non
    sono tanto intelligenti, perché quelle di VMS sono 
    meglio e perché ci sono dei tentativi di standard di 
    GNU e di FreeBSD che bisognerebbe seguire.
4) Il trucchetto proposto dall'opener per risolvere il suo
    problema (pescato da qualche parte sul WEB), perché 
    non vale niente e perché ho proposto quella miglioria, 
    visto che rimane un trucchetto, una pezza a colore, un 
    esempio di cattiva programmazione.
La risposta al 4° punto è semplice. ho la lingua lunga. 
Semplicemente ho visto un obbrobrio, ho cercatolo di
correggerlo, ci sono riuscito solo in parte.
  find è nato per scandire tutto il filesystem od una sua
parte,produrre una lista di file da processare, passare 
questa lista ad un altro programma, tipicamente cpio o tar
che elabora i file passati da find. find è pensato per fare
i backup, è pensato per fare operazioni su dei file; quindi
deve essere il programma esterno a generare un errore, 
non find. E se per caso si genera una lista di file vuota,
cosa possibile ed assolutamente normale, deve essere 
il programma che accetta questa lista vuota a decidere 
come comportarsi, se segnalare la situazione anomala o
continuare l'elaborazione.
Perciò hai ragione, è un controsenso usare find per produrre
una lista di file solo per verificare se è vuota o meno. L'
errore però non è nel trucchetto pescato sul WEB, l'errore
sta nell'impostazione dello script: find potrebbe produrre
liste vuote e quindi lo script deve elaborare liste vuote,
salvo poi a protestare per l'input inadeguato.
Spero di essermi chiarito abbastanza.
PS Se vogliamo approfondire il punto 2) e trattare anche i
punti 1) e 3) si potrebbe continuare.
Saluti.
 
 

 salvo poi a protestare per l'input inadeguato.
Forse non ho capito quanto volevi dire a suo tempo allora ;
nel post relativo al workaround con
find ... | grep ...
avevo anche citato l'idea di usare [ -f ... ]
Poi ho postato l'esempio completo
if [ -f "$(find $FILE -mtime -$DAYS)" ] ; then
	echo "$FILE is less than $DAYS days old"
fi
Che gestisce l'eventualità della lista vuota e agisce di conseguenza.
Direi che è abbastanza simile al tuo successivo esempio con -z ...
Adesso vedo che in effetti forse si erano "accavallati" i post e non ci 
siamo capiti...
Comunque grazie di tutti i consigli :-)