BUBS - Barely Ubuntu Bar Sport

Nerd Bar => Tips & Tricks => Topic aperto da: Buntolo - 06 Giugno 2013, 11:49:26

Titolo: Rinomina di massa
Inserito da: Buntolo - 06 Giugno 2013, 11:49:26
Voglio rinominare tutti i file contenuti in una cartella secondo i nomi contenuti in un file di testo.
I file nella cartella sono numeri (1 2 3 etc), i file nel testo anche (per evidenza ho messo (a b c etc).
Pensavo ad una cosa in bash con uno schema del tipo
Codice: [Seleziona]
for i in *
do
    j=roba
   mv $i $j
done

Per avere j volevo incastrare al posto di "roba" qualcosa come:
Codice: [Seleziona]
for k in $(cat testo.txt)
do
    echo $k
done
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 06 Giugno 2013, 11:57:52
Una volta ho usato bulk-rename o qualcosa di simile su linux.
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 06 Giugno 2013, 12:08:05
Una volta ho usato bulk-rename o qualcosa di simile su linux.

Ce l'ho ma non accetta file di testo come fonte.
Quello che voglio fare è rinominare in ordine numerico (dato dal nome stesso, insomma l'ordine con cui vengono elencati con 'ls') usando i nomi contenuti in un file di testo  (il file di testo contiene un nome per riga, già in ordine).
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 06 Giugno 2013, 13:01:16
Si può fare. Vediamo se riesco ad esserti di aiuto.
Per prima cosa devo sapere se i nomi dei file contengono degli spazi.
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 06 Giugno 2013, 13:31:53
Si può fare. Vediamo se riesco ad esserti di aiuto.
Per prima cosa devo sapere se i nomi dei file contengono degli spazi.

Niente spazi, niente estensioni, nomi con numeri in ordine crescente ma NON consecutivi.
Nella realtà devo cambiare da scpf123456789 e successivi (NON consecutivi) a 300120, 400190 e così via.
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 06 Giugno 2013, 13:48:12
Nel file di testo ci sono i nomi dei file originali, uno per riga?
Oppure ci sono i nomi finali dei file?

Se puoi, fammi un esempio pratico.
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 06 Giugno 2013, 14:05:14
Se si risolve il mio ambiente di prova mi basta:

$ls ./ori
1
2
3

$cat nomi_fin
a
b
c

Voglio che mi copi 1,2,3 in ./fin con nome a,b,c
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 06 Giugno 2013, 14:28:02
beh ma allora non serve usare mv, conviene usare direttamente cp

potresti farti una variabile che contenga il testo del file, ogni campo separato da uno spazio, poi con awk prendi ogni elemento dentro un for

una roba del tipo
Codice: [Seleziona]
lista_nomi=$(cat file) #conterrà i nomi messi in un'unica riga, se non ricordo male)
for i in `ls -1 ./orig`; do
     dest=$(echo $lista_nomi | awk '{print $i}')
     cp i ./spostati/$dest
done
questo funziona se i file di origine hanno nomi esattamente del tipo 1 2 3 ecc

altrimenti bisogna lavorare su awk in modo da ottenere  l'indice relativo del file rispetto al totale
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 06 Giugno 2013, 14:49:55
Codice: [Seleziona]
cp: target `c` is not a directory
cp: target `c` is not a directory
cp: target `c` is not a directory
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 06 Giugno 2013, 15:10:04
giusto, devi fare

cp ./orig/i  ./spostati/$dest
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 06 Giugno 2013, 16:23:29
Non riesco nemmeno a scrivere un ciclo >:(
Chiedo delucidazioni in un altro topo
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 06 Giugno 2013, 17:31:07
cp: cannot stat `./orig/i': No such file or directory
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 06 Giugno 2013, 23:37:26
fanculo, è ./orig/$i

:facepalm:


questo succede quando fai codice senza provarlo, scrivendolo direttamente nel browser :asd:
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 07 Giugno 2013, 00:12:35
Uhm mi sa che l'avevo messo proprio come variabile...Comunque ci penserò domani o Lunedì.
Ho dato un'occhiata a Python ma... >:(
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 00:21:18
naaa non è necessario, davvero. bash è molto potente
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 07 Giugno 2013, 07:51:40
Questo (http://forum.ubuntu-it.org/viewtopic.php?f=67&t=249770&p=1885992&hilit=ridimensiona+icone+tonywhite#p1885899) è un mio vecchio script che dovrebbe servirmi per darti una mano. Appena ho un po' di tempo provo a vedere se si può adattare alla rinominazione di massa, anche se Sgnablo risolverà prima di me.
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 07 Giugno 2013, 08:07:44
Con calma, tanto oggi vado via (in in posto molto
Titolo: Re:Rinomina di massa
Inserito da: Cire - 07 Giugno 2013, 08:51:55
Bello il posto molto.
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 09:26:57
Codice: [Seleziona]
[[email protected] ori]$ ls
1  2  3  nomi_fin  py.py
[[email protected] ori]$ python py.py
Renaming 1 -> a
Renaming 2 -> b
Renaming 3 -> c
[[email protected] ori]$ cat py.py
import os

newNames = [x for x in open('nomi_fin', 'r').read().split('\n') if x != '']
curNames = [int(x) for x in os.listdir('./') if x not in ['', 'py.py', 'nomi_fin']]
curNames.sort()

if len(newNames) != len(curNames):
print('Length mismatch, something is wrong, ABORT ABORT ABORT')

for i in curNames:
print('Renaming {} -> {}'.format(i, newNames[i - 1]))
os.rename(str(i), newNames[i - 1])
[[email protected] ori]$ cat nomi_fin
a
b
c

La struttura della cartella dev'essere ESATTAMENTE come questa, cioè:
1. ogni numero dev'essere consecutivo. Se non è così, lo script va cambiato (semplice ma mi scocciava, in caso lo cambio)
2. I file devono iniziare da 1 e non da 0. Se non è così, lo script va cambiato
3. il file python si deve chiamare py.py e deve stare nella cartella con i file da rinominare, la lista si deve chiamare nomi_fin e deve stare nella stessa cartella.
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 07 Giugno 2013, 09:31:28
Consecutivi per forza? Sono ad minchiam ma  in ordine crescente, pensavo di sfruttare os.walk o os.listdir
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 11:33:26
Lascia fare il codice a me. Ora supporta anche i nomi/numeri non consecutivi.
Codice:

Codice: [Seleziona]
import os, sys

newNames = [x for x in open('nomi_fin', 'r').read().split('\n') if x != '']
curNames = [int(x) for x in os.listdir('./') if x not in ['', 'py.py', 'nomi_fin']]
curNames.sort()

if len(newNames) != len(curNames):
        print('Length mismatch, something is wrong, ABORT ABORT ABORT')
        sys.exit(1)

for j in range(len(curNames)):
        i = curNames[j]
        print('Renaming {} -> {}'.format(i, newNames[j]))
        os.rename(str(i), newNames[j])

È un quick hack, è nei quick hack si mette il minimo indispensabile al funzionamento. Se ci sono altri requisiti me li devi dire, così ce li metto. :asd:
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 07 Giugno 2013, 11:36:50
ABORT ABORT ABORT
 :omgonoz:

 :asd:
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 11:44:26
Ma sono coglione? Dopo quella riga ci andrebbe un sys.exit(1). :asd.
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 14:58:11
Codice: [Seleziona]
#!/bin/bash
IFS='
' #separatore per gli elementi dell'array: a capo

#parametri#


ORIGINAL=./originali #percorso dei file da copiare
DESTINATION=./rinominati #percorso di destinazione
LIST=./lista  #nome file che contiene la lista di nomi





array=($(ls -1 $ORIGINAL))

len=${#array[*]}


i=0
while [ $i -lt $len ]; do
    row=$((i+1))'p' #calcolo la riga del file
    name=$(sed -n "$row" < $LIST) #ricavo il nome dal file
    cp $ORIGINAL/${array[$i]} $DESTINATION/"$name" #copio col nuovo nome
       
    let i++
done

echo "done!"


testato e funziona.

i file devono essere del tipo 01 02 ecc, perchè ls li ordina in quel modo. altrimenti ti ritrovi 1 10 11 ... 2 20 .. ecc. scegli tu come preferisci. i nomi devono essere scritti in un file, un nome per riga, e possono anche contenere spazi. tutti i parametri sono all'inizio dello script.

non fa controllo d'errore, e nella cartella di origine devono esserci SOLO i file da copiare. nel caso si può fare un po' di codice in più di controllo, se serve

Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 15:03:28
Vedi? ls li ordina in quel modo, python li ordina come vuoi tu e quindi il mio script ordina numericamente :drd:
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 15:10:03
probabilmente c'è un modo per ordinare come ti pare :asd:

ps: aggiunto un controllo, ora  nella cartella degli originali possono esserci anche cartelle, vengono ignorate.

Codice: [Seleziona]
#!/bin/bash
IFS='
' #separatore per gli elementi dell'array: a capo

#parametri#


ORIGINAL=./originali #percorso dei file da copiare
DESTINATION=./rinominati #percorso di destinazione
LIST=./lista  #nome file che contiene la lista di nomi


array=($(ls -1p $ORIGINAL | grep "[^/]$"))

len=${#array[*]}


i=0
while [ $i -lt $len ]; do
    row=$((i+1))'p' #calcolo la riga del file
    name=$(sed -n "$row" < $LIST) #ricavo il nome dal file
    cp $ORIGINAL/${array[$i]} $DESTINATION/"$name" #copio col nuovo nome
       
    let i++
done

echo "done!"
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 15:11:08
Il mio script supporta le cartelle, le rinomina. :asd:

PYTHON RULEZ BASH INFERIOR LANGUAGE
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 07 Giugno 2013, 15:11:49
Io tifo per Eldar :lkirule:
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 15:12:53
fac iea, trovato:

-v natural sort of (version) numbers within text

Codice: [Seleziona]
#!/bin/bash
IFS='
' #separatore per gli elementi dell'array: a capo

#parametri#


ORIGINAL=./originali #percorso dei file da copiare
DESTINATION=./rinominati #percorso di destinazione
LIST=./lista  #nome file che contiene la lista di nomi


array=($(ls -1pv $ORIGINAL | grep "[^/]$"))

len=${#array[*]}


i=0
while [ $i -lt $len ]; do
    row=$((i+1))'p' #calcolo la riga del file
    name=$(sed -n "$row" < $LIST) #ricavo il nome dal file
    cp $ORIGINAL/${array[$i]} $DESTINATION/"$name" #copio col nuovo nome
       
    let i++
done

echo "done!"

ora ordina i file anche se sono scritti 1 2 3 4 5 6 7 8 9 10 ecc, come ci si aspetterebbe.


a che minchia serve rinominare le cartelle? non è qualcosa che ha richiesto buntolo. e comunque, posso benissimo editare il codice in modo che rinomini anche quelle :P
python può pupparmela :drd:
Titolo: Re:Rinomina di massa
Inserito da: Cire - 07 Giugno 2013, 15:16:15
Vai con la guerra.
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 15:16:35
Funziona con 1 7 9 11 177000? Mi scoccia provare. :asd:
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 15:19:45
penso di si, non ho provato :asd:
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 15:23:04
btw funziona, ma ovviamente considera 7 come indice 2, ecc. d'altronde come minchia fa a sapere se mancano numeri? non esageriamo con il codice intelligente :asd:
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 07 Giugno 2013, 15:55:28
Secondo me è meglio assembly :lkof:
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 15:59:01
Secondo me è meglio usare venti linguaggi in un progetto, tipo un programma c++ con dentro c con dentro assembly che binda lua che usa sql per fare una query a mongodb. Tutto questo bindato da java, ovviamente :lkof:
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 07 Giugno 2013, 17:01:40
Hai fatto bingo bindo!
Titolo: Re:Rinomina di massa
Inserito da: noi3 - 07 Giugno 2013, 17:04:03
Genno, dimentichi sempre il come se fosse antani finale
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 21:23:36
Secondo me è meglio usare venti linguaggi in un progetto, tipo un programma c++ con dentro c con dentro assembly che binda lua che usa sql per fare una query a mongodb. Tutto questo bindato da java, ovviamente :lkof:

mi sembra molto sensato usare sql (linguaggio per db relazionali) per fare una query a mongodb (database su file) :asd:
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 07 Giugno 2013, 21:38:51
DIMENTICAVO CHE OVVIAMENTE DEVI USARE UN WRAPPER, IGNORANTE
CI SONO DIPENDENCE LEGACY NEL PROGETTO

Non sei abbastanza enterprise :lkof:
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 07 Giugno 2013, 21:40:40
guarda, è un po' come dire che per compilare un codice C è necessario un cric idraulico. :asd:
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 08 Giugno 2013, 09:27:23
Certo che è necessario, altrimenti come lo alziil furgoncino che toccherà il paletto che spingerà la pallina che cadrà su un'altra pallina più piccola, che andrà a finire nel tubo che la farà cadere sul tasto enter che compilerà il tuo codice C? :lki:
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 08 Giugno 2013, 09:50:08
guarda, è un po' come dire che per compilare un codice C è necessario un cric idraulico. :asd:

È un'altra app ENTERPRISE che passa a lua la query SQL, ma il db di quest'app è mongo e quindi ci vuole un wrapper. ez :lkof:
Titolo: R: Rinomina di massa
Inserito da: turlando - 09 Giugno 2013, 10:47:37
What about using Perl
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 09 Giugno 2013, 11:58:46
everyone hates perl
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 13 Giugno 2013, 11:27:37
Ok la situazione si fa più complessa.
Qui c'è bisogno di pensare ad una strategia decente, non del codice.

Nella ditta i vecchi lavori sono così suddivisi: cartella cliente con dentro buste delle commesse.
Sto parlando di roba cartacea, NON di roba informatica!
La ditta vorrebbe appunto informatizzare i vecchi lavori, che sono migliaia di buste, in soldoni vorrebbero che da un gestionale (da fare) aprendo la voce di un cliente si vedano tutto ciò che lo riguarda (penso mail, progetti, commesse, vecchi lavori).
Per i vecchi lavori penso possa andare bene così: genero 1 pdf per ogni lavoro con la bolla come prima pagina.
Nella bolla è contenuto il numero di matricola, a questo punto bisognerebbe che la scansione estrapoli il codice matricola e lo usi per rinominare il pdf.

Ci sono vari programmi ed interfacce per l'OCR, ma leggere un intero A4 e cercarci dentro un numero è complesso, sicché pensavo di fare un ritaglio di massa delle immagini nella zona col numero di matricola e poi farne l'OCR, così salta fuori solo il numero matricola.
Per l'estrazione di immagini da un pdf c'è lo script batch di sgnablo.

Come già scritto, più che buttare giù linee di codice mi servirebbe fare una lista procedurale che risponda ai seguenti interrogativi:
1) Quale tipo di strumento informatico servirebbe per gestire l'associazione di clienti, magazzino, ordini nuovi da fare, ordini vecchi fatti, etc.?
Attualmente l'unico strumento informatico presente è il gestionale Metodo che serve per creare nuovi codici magazzino (sigla componente +progressivo), ricerca in base a filtri (tipo ricerca componenti esistenti in base a sigla, data, dimensioni, etc..), ed altre cose che non so.
Come procedere? Nuovo super-mega gestionale in sostituzione a Metodo? Un nuovo applicativo da affiancare a Metodo?
Questo punto è da ancora da chiarire, nel senso che non so quali siano le necessità delle varie figure aziendali, ma sto cercando di farmi un quadro d'insieme.

Questa domanda penso sia soprattutto per alesales.

2) Parlando solo di pdf le operazioni che ho individuato sono: estrazione immagine da pdf, ritaglio immagine, OCR immagine, rinominazione pdf con testo OCR.
Voi vedete un percorso migliore?

3) Una volta individuato il percorso, com'è meglio procedere? N programmi, uno per ogni operazione, attivati in sequenza da uno script?
Un mega programma unico?
N programmi separati da usare manualmente?
I computer qua sono tutti Windows 7, che uso? Non penso di poter usare bash... :squomg:

4) Creo una nuova discussione o N discussioni separate per ogni sotto problema?
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 13 Giugno 2013, 11:40:11
Mi sa tanto che per risolverti il problema ti dobbiamo fare una fattura :asd:
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 13 Giugno 2013, 12:53:31
Mi sa tanto che per risolverti il problema ti dobbiamo fare una fattura :asd:
Titolo: R: Rinomina di massa
Inserito da: turlando - 13 Giugno 2013, 16:16:08
Nchia del bordello zì
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 13 Giugno 2013, 18:01:44
Mi sa tanto che per risolverti il problema ti dobbiamo fare una fattura :asd:


1) DIOANALE
2) OPERAMERDA

avevo risposto ma mi ha cancellato tutto...

Avevo scritto:
Lo so che una cosa del genere è grossa, infatti non chiedo codice ma l'iter da seguire per affrontare la cosa.
che esperienze professionali di programmazione avete  che in che regioni vivete?
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 14 Giugno 2013, 10:37:39
Non ho mai progettato una rete aziendale degna di questo nome. Però il gestionale rientra nelle mie competenze.
Vivo in Puglia.

Mi interessa la discussione e mi piacerebbe dare una mano senza troppo impegno (in termini di tempo), ma se mi libererò in tempo di qualche lavoro extra potrò tirare giù qualche algoritmo.
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 14 Giugno 2013, 11:34:45
Ho trovato i singoli programmi che facciano alcune operazioni, appena posso farò lgs carrellata.
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 14 Giugno 2013, 13:51:53
Ho trovato i singoli programmi che facciano alcune operazioni, appena posso farò lgs carrellata.
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 14 Giugno 2013, 13:59:10
Grazie per avercelo ricordato.
Titolo: Re:Rinomina di massa
Inserito da: Darko - 14 Giugno 2013, 14:05:07
@buntolo: cambia browser, please :asd:
Titolo: Re:Rinomina di massa
Inserito da: AirPort - 14 Giugno 2013, 14:07:01
@buntolo: cambia browser, please :asd:

Già
Titolo: Re:Rinomina di massa
Inserito da: AirPort - 14 Giugno 2013, 14:07:08
@buntolo: cambia browser, please :asd:

Già
Titolo: Re:Rinomina di massa
Inserito da: the_original_g - 14 Giugno 2013, 14:22:03
@buntolo: cambia browser, please :asd:

Già
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 14 Giugno 2013, 15:46:33
 :rotfl: :rotfl: :rotfl: :rotfl:
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 14 Giugno 2013, 15:52:17
Consigliatemi un browser per android.
Tenete conto che odio chrome in tutte le sue forme.
Titolo: Re:Rinomina di massa
Inserito da: madnessmike - 14 Giugno 2013, 16:06:07
Io uso Chrome in tutte le sue forme :asd:
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 14 Giugno 2013, 16:09:17
Odi anche Dolphin? È buono al cartoccio :lki:
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 14 Giugno 2013, 16:45:40
Ho trovato i singoli programmi che facciano alcune operazioni, appena posso farò lgs carrellata.
Titolo: Re:Rinomina di massa
Inserito da: Darko - 14 Giugno 2013, 16:48:02
@buntolo: hai rotto il cazzo. Seriamente :asd:
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 14 Giugno 2013, 16:49:40
dolphin com'è?
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 14 Giugno 2013, 16:50:17
dolphin com'è?
Titolo: Re:Rinomina di massa
Inserito da: Buntolo - 14 Giugno 2013, 16:50:38
dolphin com'è?
Titolo: Re:Rinomina di massa
Inserito da: madnessmike - 14 Giugno 2013, 16:51:12
Provalo :verovero:
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 14 Giugno 2013, 16:52:34
Che ti sei squartato il cazzo con Opera l'abbiamo capito tutti, ora fila a provare il delfino :gtfo:

 :asd: :asd: :asd:
Titolo: Re:Rinomina di massa
Inserito da: Darko - 14 Giugno 2013, 16:59:39
Dolphin è bellino, tra l'altro parecchio modulare.
Titolo: Re:Rinomina di massa
Inserito da: Cire - 14 Giugno 2013, 17:40:08
Io uso dolphin e mi trovo abbastanza bene.
Titolo: R: Rinomina di massa
Inserito da: mustangtux - 14 Giugno 2013, 19:59:54
Opera mobile + Chrome

Mi trovo strabene :p
Titolo: Re:Rinomina di massa
Inserito da: sgnablo - 14 Giugno 2013, 21:51:59
io ho smesso di usare dolphin perchè ha iniziato a crashare se usavo js attivo. e mi è dispiaciuto, perchè è il mio preferito :bye:
Titolo: Re:Rinomina di massa
Inserito da: TonyWhite - 16 Giugno 2013, 00:03:27
In realtà usavi Justin Scriber :lkof: