[Risolto] Problema di rm in uno script

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Jones il suonatore
Prode Principiante
Messaggi: 91
Iscrizione: martedì 20 gennaio 2009, 14:32

[Risolto] Problema di rm in uno script

Messaggio da Jones il suonatore »

Salve gente, avrei un problema (di sintassi suppongo) in uno script.

Questo script deve fare una cosa semplice: eliminare tutti i file jpg nella cartella di lavoro e nelle sue sottocartelle. Allora ho scritto una cosa del genere:

for IMMAGINI in $(ls -b *jpg) $(ls -b */*jpg); do rm $IMMAGINI ; done

E per quanto funzioni per tutti i file senza spazi nel nome, appena ne incontra uno che invece ne ha, il comando rm da errore. Ad esempio tra tutti i file che devo eliminare c'è un file che si chiama "save the cheerleader.jpg" e appena mando quel comando, ottengo un errore di rm:

Codice: Seleziona tutto

rm: impossibile rimuovere "save\\": File o directory non esistente
rm: impossibile rimuovere "the\\": File o directory non esistente
rm: impossibile rimuovere "cheerleader.jpg": File o directory non esistente
Il problema non riesco a capire veramente dov'è, anche perché dando manualmente il valore giusto a una variabile:

IMG="save\ the\ cheerleader.jpg"

con

rm $IMG

ottengo lo stesso identico errore, mentre con

rm save\ the\ cheerleader.jpg

che dovrebbe essere identico, tutto va a buon fine.

Cosa sbaglio?

P.s. ho già provato a togliere l'opzione -b dal comando ls, e ottengo solo un errore diverso:

Codice: Seleziona tutto

rm: impossibile rimuovere "save": File o directory non esistente
rm: impossibile rimuovere "the": File o directory non esistente
rm: impossibile rimuovere "cheerleader.jpg": File o directory non esistente
Ultima modifica di Jones il suonatore il lunedì 27 dicembre 2010, 16:27, modificato 1 volta in totale.
To Cooney Potter a pillar of dust
Or whirling leaves meant ruinous drouth.
They looked to me like Red-Head Sammy
Stepping it off, to "Toor-a-Loor."
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problema di rm in uno script

Messaggio da Zoff »

Perché il delimitatore predefinito di stringhe dei for è lo spazio, se usi l'opzione -b aggiungi uno slash ai nomi, ma questo viene interpretato coem carattere non come escape.
Se non usi -b ricadi comunque nel problema del delimitatore.

Per risolvere:

Codice: Seleziona tutto

OLDIFS=$IFS
IFS=$'\n'
for IMMAGINI in $(ls -l *jpg) $(ls -l */*jpg); do rm $IMMAGINI ; done
IFS=$OLDIFS
O meglio:

Codice: Seleziona tutto

find -maxdepth 2 -iname "*.jpg" -exec rm {} \;
Che a parole sarebbe: "trova tutti i file che terminano per .jpg case INsensitive ( -iname "*.jpg" ) nella cartella corrente e in tutte le dirette sottocartelle (-maxdepth 2) e rimuovili ( -exec rm {} \; )"
Ultima modifica di Zoff il domenica 26 dicembre 2010, 2:09, modificato 1 volta in totale.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Jones il suonatore
Prode Principiante
Messaggi: 91
Iscrizione: martedì 20 gennaio 2009, 14:32

Re: Problema di rm in uno script

Messaggio da Jones il suonatore »

Zoff ha scritto: Perché il delimitatore predefinito di stringhe dei for è lo spazio, se usi l'opzione -b aggiungi uno slash ai nomi, ma questo viene interpretato coem carattere non come escape.
Se non usi -b ricadi comunque nel problema del delimitatore.

Per risolvere:

Codice: Seleziona tutto

OLDIFS=$IFS
IFS=$'\n'
for IMMAGINI in $(ls -l *jpg) $(ls -l */*jpg); do rm $IMMAGINI ; done
IFS=$OLDIFS
O meglio:

Codice: Seleziona tutto

find -maxdepth 2 -iname "*.jpg" -exec rm {} \;
Che a parole sarebbe: "trova tutti i file che terminano per .jpg case INsensitive ( -iname "*.jpg" ) nella cartella corrente e in tutte le dirette sottocartelle (-maxdepth 2) e rimuovili ( -exec rm {} \; )"
Ok, il comando con il find funziona alla grande, mentre il for no (l'ho messo in uno script e l'ho avviato). Tra l'altro il problema non credo sia nel for, anche perché come ho detto facendo una cosa del genere:

IMG="save\ the\ cheerleader.jpg"
rm $IMG

Ricevo gli stessi identici errori (mentre con "rm save\ the\ cheerleader.jpg" no), quindi credo che il problema sia nel rm, non nel for.

Grazie comunque della soluzione alternativa, va alla perfezione :D
To Cooney Potter a pillar of dust
Or whirling leaves meant ruinous drouth.
They looked to me like Red-Head Sammy
Stepping it off, to "Toor-a-Loor."
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problema di rm in uno script

Messaggio da Zoff »

Ah giustoi, nel form mancano le virgolette nel rm:

Codice: Seleziona tutto

OLDIFS=$IFS
IFS=$'\n'
for IMMAGINI in $(ls -l *jpg) $(ls -l */*jpg); do rm "$IMMAGINI" ; done
IFS=$OLDIFS
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Elrond
Rampante Reduce
Rampante Reduce
Messaggi: 5018
Iscrizione: sabato 22 novembre 2008, 12:32
Contatti:

Re: Problema di rm in uno script

Messaggio da Elrond »

Zoff ha scritto: Ah giustoi, nel form mancano le virgolette nel rm:

Codice: Seleziona tutto

OLDIFS=$IFS
IFS=$'\n'
for IMMAGINI in $(ls -l *jpg) $(ls -l */*jpg); do rm "$IMMAGINI" ; done
IFS=$OLDIFS
Come spiegato da takeshi qui, è sconsigliato usare ls negli script specie se si possono sfruttare altri metodi come il find già chiamato in causa oppure semplicemente

Codice: Seleziona tutto

for IMMAGINI in *jpg */*jpg; do rm "$IMMAGINI" ; done
P. S. perché l'opzione -l a ls?
Il mio blog su Ubuntu | Script per vedere canali RAI in diretta senza browser (discussione)
Quando devi inserire nei messaggi del codice usa il tag code, è il pulsante # sopra le emoticon: [code]inserisci il testo qui[/code]
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Problema di rm in uno script

Messaggio da Zoff »

Elrond ha scritto: P. S. perché l'opzione -l a ls?
Per nessun motivo in particolare :D
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Jones il suonatore
Prode Principiante
Messaggi: 91
Iscrizione: martedì 20 gennaio 2009, 14:32

Re: Problema di rm in uno script

Messaggio da Jones il suonatore »

Grazie mille ad entrambi, metto "Risolto"
:D
To Cooney Potter a pillar of dust
Or whirling leaves meant ruinous drouth.
They looked to me like Red-Head Sammy
Stepping it off, to "Toor-a-Loor."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti