PDA

View Full Version : Errore "find: missing argument to `-exec' ", perchè?


]DaLcA[
16-09-2006, 11:33
Ciao a tutti :) Dopo innumerevoli prove e ricerche in rete non sono riuscito a risolvere un problema. Devo scrivere un grosso (almeno per me) script, che dopo alcune modifiche ha deciso di non funzionare più. Sono riuscito ad identificare questo come l'errore che è a causa di tutto. A grandi linee, devo salvare in una variabile il codice che devo eseguire, ma quando faccio delle prove sulla console mi dà l'errore:

find: missing argument to `-exec'

Per riprodurre l'errore creo una variabile contentente il comando che devo eseguire, tipo:

VAR="find /tmp -exec du -sb {} \;"

e poi cerco di eseguire il codice al sul interno con

$VAR

che mi restituisce l'errore. Ho provato con l'escaping del carattere \ e di {}, ma senza successo. Dall'alto della mia inesperienza credo che sia colpa del "-" prima dell'exec, infatti se in qualche modo lo tolgo mi dà un errore simile per l'opzione "-sb" del du, e, se tolgo questa opzione, tutto funziona (non come dovrebbe, ma funziona senza errori).

Eseguendo solo

find /tmp -exec du -sb {} \;

(senza metterlo in una variabile) non si presentano errori e il comando funziona come dovrebbe. Ora, dove sbaglio? Non riesco proprio a capire :cry:

kingv
16-09-2006, 22:28
[OT] nell'altro topic che avevi aperto non mi hai risposto nulla :O

PiloZ
16-09-2006, 22:49
la butto li rischiando di dire una cavolata e fare na figuraccia, ma non essendo a casa non posso provare:
togli i 2 "" e metti 2 ``

fammi sapere se mi devo at :tapiro: are ;)
ciao :)

Scoperchiatore
17-09-2006, 01:18
hai provato anche a eseguire invece di
$VAR
con
"$VAR"

sembra un problema di escaping dei caratteri, dato che l'argomento in linea teorica c'è...

]DaLcA[
17-09-2006, 10:31
[OT] nell'altro topic che avevi aperto non mi hai risposto nulla :O
Ora ho risposto :D

la butto li rischiando di dire una cavolata e fare na figuraccia, ma non essendo a casa non posso provare:
togli i 2 "" e metti 2 ``

fammi sapere se mi devo at :tapiro: are ;)
ciao :)

Con gli apici inversi si ottiene lo stesso risultato, però il concetto non è sbagliato :p

Ti sei salvato dall'attapiramento :Prrr:

hai provato anche a eseguire invece di
$VAR
con
"$VAR"

sembra un problema di escaping dei caratteri, dato che l'argomento in linea teorica c'è...

Ho provato appena adesso e ho ottenuto un altro errore:

-bash: find /tmp -exec du -sb {} \;: No such file or directory

Probabilmente perchè vede il tutto come un'unica stringa e non sa cosa fare! Anch'io sono convinto che sia un problema di escaping, solo che tutte le "tecniche " descritte nelle varie guide online non risolvono il problema (che imho non ha senso di esistere perchè è concettualmente corretto) :cry:

Scoperchiatore
17-09-2006, 12:39
Prova a inizializzare VAR senza apici, e poi a eseguirlo sia con sia senza gli apici.

Mi ricordo che quando ho dovuto fare un tester automatico per un esame all'uni, avevo lo stesso problema con java -classpath... e risolsi con qualche apice in giro

]DaLcA[
17-09-2006, 17:55
Sono riuscito :cool:

Ho fatto uno script di prova semplice semplice e ho visto che il seguente codice funzionava:


VAR=`find /tmp -exec du -sb {} \;`

"$VAR"


Per il lavoro che devo fare, ho necessità di scremare -- tra le altre cose -- file e cartelle in base alla dimensione. Ho uno script a cui da un altro programma vengono passati i parametri della ricerca; all'inizio avevo pensato di memorizzare in una variabile tutto il codice che doveva seguire il find, quindi il -exec col du e l'awk ma in seguito alla prova effettuata con lo script qui sopra ho deciso di smembrare le variabili che dovevo usare (e che davano problemi) ottenendo le seguente parte di codice (che spero si capisca):


if [[ $4 == '' && $5 == '' ]]; then # se la ricerca non è per dimensione
RISULTATI=`find $1 $NOME $SUBDIR $DATA $TIPO`
else
if [[ $5 == '' ]]; then # se non è specificata la dimensione massima
RISULTATI=`find $1 $NOME $SUBDIR $DATA $TIPO -exec du -sb {} \; | awk '{if ($1 > '$DIM_MIN') print $2}'`
else # se sono specificate entrambe le dimensioni
RISULTATI=`find $1 $NOME $SUBDIR $DATA $TIPO -exec du -sb {} \; | awk '{if ($1 > '$DIM_MIN' && $1 < '$DIM_MAX') print $2}'`
fi
fi


Nell'ultimo caso, se DIM_MIN non è specificata viene comunque inizializzata a 0, non mi sono dimenticato rami dell'if :p


Volevo memorizzare in una variabile tutto il

-exec du -sb {} \; | awk '{if ($1 > '$DIM_MIN' && $1 < '$DIM_MAX') print $2}'

per non mettere gli if, per quello avevo esposto il problema, del quale non riesco ancora a capire il motivo dell'esistenza, in quanto il codice era giusto :boh:


Con questa spiegazione spero di essere utile a qualcun altro in futuro :)