BASH - generare nomi files

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

BASH - generare nomi files

Messaggio da danix »

Ciao a tutti...
mi date una mano con uno script bash??
vorrei generare una lista di nomi strutturati in questo modo:

Codice: Seleziona tutto

testo-[0-9][0-9][0-9][0-9]-testo-000[0-9][0-9][0-9].ext
da salvare in un file di testo uno per riga... ma non ho la più pallida idea di dove cominciare... :(

PS
non voglio la pappa pronta, mi basta che mi indirizziate per le ricerche... ;)


ciao ciao
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: BASH - generare nomi files

Messaggio da sixjan »

Codice: Seleziona tutto

for n in `seq 10`; do

  QUATTROCIFRE=`echo $RANDOM$RANDOM | head -c4`
  TRECIFRE=`echo $RANDOM$RANDOM | head -c3`
  echo testo-$QUATTROCIFRE-testo-000$TRECIFRE.ext

done
Semplice e banale esempio per cominciare. Lo script genera
dieci nomi del tipo richiesto. Per salvarli su un file,
basta redirigere l'output. La variabile $RANDOM
dà un numero casuale da 0 a 32767. Io ne ho incollati due per
sicurezza, però potrebbero capitare due random da una cifra
e lo script non funzionerebbe. Bisogna aggiungere una funzione di controllo,
ma non vuoi la pappa pronta :-) ciao
Adesso spina scrive una riga e mi fa sentire un cretino :-)
Ultima modifica di sixjan il dom 8 mar 2009, 0:27, modificato 1 volta in totale.

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: BASH - generare nomi files

Messaggio da sixjan »

oppure per non usare $RANDOM:

Codice: Seleziona tutto


for n in `seq 10`; do

  QUATTROCIFRE=`head -c10 /dev/urandom | sum | head -c4`
  TRECIFRE=`head -c10 /dev/urandom | sum | head -c3`
  echo testo-$QUATTROCIFRE-testo-000$TRECIFRE.ext

done


Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: BASH - generare nomi files

Messaggio da targzeta »

sixjan ha scritto:...Adesso spina scrive una riga e mi fa sentire un cretino :-)
Sono molto onorato di essere considerato da te "uno che ne sa di bash script" :oops:, ma per ora il cretino mi sento io, perchè non ho proprio capito cosa vuole ottenere danix.

Se ci potessi fare un esempio del file che vuoi ottenere danix te ne sarei grato :), ti basta, come dice sixjan numeri random e li vuoi sequenziali?

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Re: BASH - generare nomi files

Messaggio da danix »

:D

grazie ragazzi, comunque si, li vorrei sequenziali, diciamo che è roba da dare in pasto a wget, quindi mi interessa che coprano tutti i range che ho imposto in maniera completa, per capirci:
da
testo-0000-testo-000000.ext
a
testo-9999-testo-000999.ext
in modo da redirigerli in un file e poi far fare al programma... ;)
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: BASH - generare nomi files

Messaggio da targzeta »

Danix,
non è ancora chiaro. Ci sono due "contatori", come si devono incrementare? Le prime due righe devono essere:

Codice: Seleziona tutto

testo-0000-testo-000000.ext
testo-0000-testo-000001.ext
o

Codice: Seleziona tutto

testo-0000-testo-000000.ext
testo-0001-testo-000001.ext
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Re: BASH - generare nomi files

Messaggio da danix »

devono incrementare da destra verso sinistra, quindi si inizia da
testo-0000-testo-000000.ext
testo-0000-testo-000001.ext
[...]
testo-0000-testo-000998.ext
testo-0000-testo-000999.ext
testo-0001-testo-000000.ext
testo-0001-testo-000001.ext
ecc...

spero di essermi spiegato meglio ora... :D
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: BASH - generare nomi files

Messaggio da raffaele181188 »

Guarda, secondo me ti basta una variabile $counter. Quindi una cosa del tipo

Codice: Seleziona tutto

#sei sicuro di aver descritto bene? Mi sembra che ci vorranno un milione di cicli in totale...
for $counter in [0-1000!!!] do;
   for $number in [0-999] do;
      vabbe di bash scripting non me ne intendo, penso che si capisca da qui in avanti... :-)
      echo tipo text-$counter(formattato opportunamente)-text-$number(formattato).txt
   done
done

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: BASH - generare nomi files

Messaggio da sixjan »

Un esempio per fare quello che dici tu:

Codice: Seleziona tutto


#/bin/bash

MAX=10
COUNT=0

for QUATTROCIFRE in `seq -w 0 9999`; do
  for TRECIFRE in `seq -w 0 999`; do
    echo testo-$QUATTROCIFRE-testo-000$TRECIFRE.ext
    let COUNT=$COUNT+1
    [[ $COUNT == $MAX ]] && exit
  done
done

ciao

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Re: BASH - generare nomi files

Messaggio da danix »

non conoscevo seq... ;) ora gli do un'occhiata... grazie mille dell'hint... :D
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: BASH - generare nomi files

Messaggio da Mario Vanoni »

Ed invece di un

echo testo-$QUATTROCIFRE-testo-000$TRECIFRE.ext

usa printf(1) dei coreutils.

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Re: BASH - generare nomi files

Messaggio da danix »

grazie anche a te Mario, vedrò quello che riesco a tirare fuori :D
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: BASH - generare nomi files

Messaggio da targzeta »

Tanto per dire la mia, il comando di sixjan è equivalente a questo:

Codice: Seleziona tutto

for seq in `seq -w 0 9999999`;
  do echo "testo-${seq:0:4}-testo-000${seq:4}";
done
solo che....bhé e interessante quello che succede :). Analizzate con conky il consumo di risorse (memoria, processore), e se lo interrompete (come farete sicuramente) killate la shell sulla quale lo eseguite altrimenti non viene rilasciata la memoria allocata.

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Re: BASH - generare nomi files

Messaggio da danix »

purtroppo ho notato... :( mi sa che devo ridurre (di molto) il range...
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: BASH - generare nomi files

Messaggio da Mario Vanoni »

spina ha scritto:Tanto per dire la mia, il comando di sixjan è equivalente a questo:

Codice: Seleziona tutto

for seq in `seq -w 0 9999999`;
  do echo "testo-${seq:0:4}-testo-000${seq:4}";
done
solo che....bhé e interessante quello che succede :). Analizzate con conky il consumo di risorse (memoria, processore), e se lo interrompete (come farete sicuramente) killate la shell sulla quale lo eseguite altrimenti non viene rilasciata la memoria allocata.

Spina
Perfetto se togli i due punto e virgola (;) finali.

time .z >> .zz
4m21.804s
file di 10'000'000 righe.

Con Ctrl-C puoi interrompere.

Rispondi