[risolto][Bash]Lavorare l'output di find

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
l3on4rdo

[risolto][Bash]Lavorare l'output di find

Messaggio da l3on4rdo »

Ciao a tutti.
Ho masterizzato alcuni MIEI cd musicali e mi sono accorto che sono state create, non so perchè, delle immagini della copertina dell'album, con il nome "strano", in tedesco, Vorne (che vuol dire front, del resto).

Ho pensato bene di rinominare i file ... usando il comando find.

Dal momento che tutte le copertine contengono la parola Vorne, ho pensato di dare:

Codice: Seleziona tutto

find ./ -type f -name *Vorne*jpg -exec mv {} folder.jpg \;
Il problema è il seguente.
Ho lanciato il comando stando nella directory, che, per brevità, chiamo

Codice: Seleziona tutto

~/Musica/A
I vari album, però, sono contenuti nelle dieci sottodirectory

Codice: Seleziona tutto

~/Musica/A/CDN
in cui N corre da 01 a 10.

Il risultato del comando che ho dato è stato quello di cancellare tutti i singoli file e crearmene uno (risultato di 10 sovrascritture, credo) nella cartella /A ... ovvero quella in cui avevo lanciato il comando.

Esiste un modo per "lavorare", tramite l'exec di find, il file nella cartella in cui è contenuto, in maniera ricorsiva e supponendo che ogni file sia contenuto in una directory differente (come insomma è il mio caso)
Vorrei evitare di dover aggiungere, se in futuro mi dovesse ricapitare un problema analogo, un pezzo ulteriore con un ciclo e un comando seq.

Grazie in anticipo.
Ciao
Ultima modifica di l3on4rdo il martedì 23 febbraio 2010, 16:24, modificato 1 volta in totale.
l3on4rdo

Re: [Bash]Lavorare l'output di find

Messaggio da l3on4rdo »

Mi sa che l'unica soluzione sia inserire un ciclo del tipo:

Codice: Seleziona tutto

for i in $( seq 1 1 9 ); do
 find ./CD-0$i -type f -name *Vorne*jpg -exec mv {} ./CD-0$i/folder.jpg \;
Alternative ?
Avatar utente
il_muflone
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 18878
Iscrizione: venerdì 1 maggio 2009, 15:31
Desktop: GNOME Shell
Distribuzione: Arch Linux x86_64
Località: Profondo sud
Contatti:

Re: [Bash]Lavorare l'output di find

Messaggio da il_muflone »

non l'ho provato:

Codice: Seleziona tutto

find ./ -type f -name *Vorne*jpg | { while read file; do mv $file $(dirname $file)/folder.jpg; done; };
http://www.muflone.com - I miei contatti e i miei progetti - La guida completa a VirtualBox
Non mandatemi messaggi privati per chiedere aiuto, li cancello senza rispondere nemmeno.
l3on4rdo

Re: [Bash]Lavorare l'output di find

Messaggio da l3on4rdo »

il_muflone ha scritto: non l'ho provato:

Codice: Seleziona tutto

find ./ -type f -name *Vorne*jpg | { while read file; do mv $file $(dirname $file)/folder.jpg; done; };
me lo salvo e ti faccio sapere, grazie. (suppongo che funzioni visto che la modifica che ho fatto, in sostanza un echo, mi produce un risultato "buono")
ho fatto una prova modificando il tuo codice per capire meglio la sintassi di read, e ti chiederei un chiarimento.

tu usi il builtin

Codice: Seleziona tutto

       read [-r] [nome ...]
              Una  linea  è  letta  dallo  standard input, e la prima parola è
              assegnata al primo nome, la seconda parola al  secondo  nome,  e
              così via, con le parole rimaste assegnate all’ultimo nome.  Solo
              i caratteri  in  IFS  sono  riconosciuti  come  delimitatori  di
              parola.  Se non è fornito alcun nome, la linea letta è assegnata
              alla variabile REPLY.  Il codice di ritorno è zero, a  meno  che
              sia  incontrata  la  fine del file.  Se è data l’opzione -r, una
              coppia backslash-newline non è ignorata, e il backslash  è  con‐
              siderato essere parte della linea.
se tu non avessi messo "file", tale variabile sarebbe stata quella che qui chiama REPLY ?
ovvero il codice interno alle parentesi graffe sarebbe stato:

Codice: Seleziona tutto

{ while read file; do mv $REPLY $(dirname $REPLY)/folder.jpg; done; }
ciao
Avatar utente
Elrond
Rampante Reduce
Rampante Reduce
Messaggi: 5018
Iscrizione: sabato 22 novembre 2008, 12:32
Contatti:

Re: [Bash]Lavorare l'output di find

Messaggio da Elrond »

l3on4rdo ha scritto: tu usi il builtin

Codice: Seleziona tutto

       read [-r] [nome ...]
              Una  linea  è  letta  dallo  standard input, e la prima parola è
              assegnata al primo nome, la seconda parola al  secondo  nome,  e
              così via, con le parole rimaste assegnate all’ultimo nome.  Solo
              i caratteri  in  IFS  sono  riconosciuti  come  delimitatori  di
              parola.  Se non è fornito alcun nome, la linea letta è assegnata
              alla variabile REPLY.  Il codice di ritorno è zero, a  meno  che
              sia  incontrata  la  fine del file.  Se è data l’opzione -r, una
              coppia backslash-newline non è ignorata, e il backslash  è  con‐
              siderato essere parte della linea.
se tu non avessi messo "file", tale variabile sarebbe stata quella che qui chiama REPLY ?
ovvero il codice interno alle parentesi graffe sarebbe stato:

Codice: Seleziona tutto

{ while read file; do mv $REPLY $(dirname $REPLY)/folder.jpg; done; }
ciao
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
il_muflone
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 18878
Iscrizione: venerdì 1 maggio 2009, 15:31
Desktop: GNOME Shell
Distribuzione: Arch Linux x86_64
Località: Profondo sud
Contatti:

Re: [Bash]Lavorare l'output di find

Messaggio da il_muflone »

si ma non è il caso di scrivere script porcari incomprensibili
$file ha un senso, $REPLY mica tanto
http://www.muflone.com - I miei contatti e i miei progetti - La guida completa a VirtualBox
Non mandatemi messaggi privati per chiedere aiuto, li cancello senza rispondere nemmeno.
l3on4rdo

Re: [Bash]Lavorare l'output di find

Messaggio da l3on4rdo »

il_muflone ha scritto: si ma non è il caso di scrivere script porcari incomprensibili
$file ha un senso, $REPLY mica tanto
no no...la porcarata era solo per spiegarmi e capire se avevo inteso bene il comando, ossia che l'output (del primo comando) letto come input (da read) veniva nominato come variabile $file
;)

penso che la discussione possa ritenersi risolta.
grazie mille  (b2b)
Ultima modifica di l3on4rdo il martedì 23 febbraio 2010, 16:35, modificato 1 volta in totale.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti