Se avete dubbi o domande sulla programmazione in generale, fatele qui

Messaggio9 novembre 2011, 1:00 - Bash: evitare di nidificare for #108416

Ho n directory con dentro svariati file. Per ogni directory devo fare la stessa operazione tramite un ciclo for... do.
C'è un modo per operare direttamente su tutte le directory senza nidificare 2 for?
Intel Core Processore i5 650 Box 3,20 GHz 1156 ; AsRock H55DE3 Scheda Madre 1156 Intel 4xddr3 2600 atx vga1759 Full HD ; 2GB DDR3 Memory 1333MHz ; Arch64 + Gnome Shell
Avatar utente
cypherinside
Arciere
 
Messaggi: 263
Iscritto il: 17 ottobre 2010, 13:46
Top

Messaggio9 novembre 2011, 1:37 - Bash: evitare di nidificare for #108420

Puoi usare find per ottenere una lista di tutte le directory o file che ti interessano da poi usare in pipelining con le operazioni che vuoi fare.
Per esempio questo script rinomina tutti i file a partire dal percorso corrente con l'esecuzione di find e un'unico ciclo while-do:

Codice: Seleziona tutto
find * -type f | while read x ;
do
        # Translate Caps to Small letters
        y=$(echo "$x" | tr '[A-Z ]' '[a-z_]');
        if [ "$x" != "$y" ]; then
                mv "$x" "$y";
        fi
done


Considera che il comando find permette anche la possibilità di specificare l'azione che si vuole eseguire sui risultati della ricerca direttamente al suo lancio avendo una cosa del tipo (sempre usando l'esempio del renaming):

Codice: Seleziona tutto
find * -type f -exec rename.sh
"It seems that perfection is reached not when there is nothing left to add, but when there is nothing left to take away".
Antoine de Saint Exupéry
http://www.keepsimple.it
Avatar utente
lgaggini
Arciere
 
Messaggi: 277
Iscritto il: 21 gennaio 2011, 0:46
Località: Pescia (PT)
Top

Messaggio9 novembre 2011, 2:38 - Bash: evitare di nidificare for #108427

"read x" cosa fa? Legge il contenuto delle directory?
Io per ogni directory devo fare questo lavoro:
Codice: Seleziona tutto
for i in *.png; do mogrify -contrast "$i"; done

solo che vorrei farlo una volta sola per tutte.
Come dovrei fare?
Codice: Seleziona tutto
find * -type d | while read x; do
e poi nidificarci dentro il ciclo for? Alla cieca ho anche provato a farlo
(
Codice: Seleziona tutto
find * -type d | while read x; do for i in *.png; do mogrify -contrast "$i"; done
) ma non funziona. O manca qualche parentesi o è concettualmente sbagliato.
Intel Core Processore i5 650 Box 3,20 GHz 1156 ; AsRock H55DE3 Scheda Madre 1156 Intel 4xddr3 2600 atx vga1759 Full HD ; 2GB DDR3 Memory 1333MHz ; Arch64 + Gnome Shell
Avatar utente
cypherinside
Arciere
 
Messaggi: 263
Iscritto il: 17 ottobre 2010, 13:46
Top

Messaggio9 novembre 2011, 3:10 - Bash: evitare di nidificare for #108429

il metodo che vuoi usare tu dovrebbe funzionare così
Codice: Seleziona tutto
find * -type d | while read x; do cd "$x"; for i in *.png; do mogrify -contrast "$i"; done; done;

però stai usando comunque due cicli, un while e un for. Non vedo grossi vantaggi...
Al posto tuo farei così
Codice: Seleziona tutto
find -iname "*.png" | while read x; do mogrify -contrast "$x"; done;

non chiedermi di testarli che sono le 2. Spero di non aver scritto cappellate. 'Notte.
Se avete risolto il vostro problema, aggiungete [Risolto]+Spazio_Bianco al titolo del primo post del thread.
Offertissima: Mi Vendo!!! Cercasi lavoro (qualunque, tra quelli leciti) in tutta italia da Roma in su.
Avatar utente
4javier
Moderatore
 
Messaggi: 6061
Iscritto il: 5 ottobre 2008, 17:19
Top


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

Moderatori: 4javier, aleph, veleno77, adriano, Hilinus