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
for i in *
do
j=roba
mv $i $j
done
Per avere j volevo incastrare al posto di "roba" qualcosa come:
for k in $(cat testo.txt)
do
echo $k
done
Una volta ho usato bulk-rename o qualcosa di simile su linux.
Citazione di: Mr. White il 06 Giugno 2013, 11:57:52
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).
Si può fare. Vediamo se riesco ad esserti di aiuto.
Per prima cosa devo sapere se i nomi dei file contengono degli spazi.
Citazione di: Mr. White il 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.
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.
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.
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
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
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
cp: target `c` is not a directory
cp: target `c` is not a directory
cp: target `c` is not a directory
giusto, devi fare
cp ./orig/i ./spostati/$dest
Non riesco nemmeno a scrivere un ciclo >:(
Chiedo delucidazioni in un altro topo
cp: cannot stat `./orig/i': No such file or directory
fanculo, è ./orig/$i
:facepalm:
questo succede quando fai codice senza provarlo, scrivendolo direttamente nel browser :asd:
Uhm mi sa che l'avevo messo proprio come variabile...Comunque ci penserò domani o Lunedì.
Ho dato un'occhiata a Python ma... >:(
naaa non è necessario, davvero. bash è molto potente
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.
Con calma, tanto oggi vado via (in in posto molto
Bello il posto molto.
[gen@m4p ori]$ ls
1 2 3 nomi_fin py.py
[gen@m4p ori]$ python py.py
Renaming 1 -> a
Renaming 2 -> b
Renaming 3 -> c
[gen@m4p 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])
[gen@m4p 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.
Consecutivi per forza? Sono ad minchiam ma in ordine crescente, pensavo di sfruttare os.walk o os.listdir
Lascia fare il codice a me. Ora supporta anche i nomi/numeri non consecutivi.
Codice:
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:
ABORT ABORT ABORT
:omgonoz:
:asd:
Ma sono coglione? Dopo quella riga ci andrebbe un sys.exit(1). :asd.
#!/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
Vedi? ls li ordina in quel modo, python li ordina come vuoi tu e quindi il mio script ordina numericamente :drd:
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.
#!/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!"
Il mio script supporta le cartelle, le rinomina. :asd:
PYTHON RULEZ BASH INFERIOR LANGUAGE
Io tifo per Eldar :lkirule:
fac iea, trovato:
-v natural sort of (version) numbers within text
#!/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:
Vai con la guerra.
Funziona con 1 7 9 11 177000? Mi scoccia provare. :asd:
penso di si, non ho provato :asd:
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:
Secondo me è meglio assembly :lkof:
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:
Hai fatto bingo bindo!
Genno, dimentichi sempre il come se fosse antani finale
Citazione di: dude il 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:
mi sembra molto sensato usare sql (linguaggio per db relazionali) per fare una query a mongodb (database su file) :asd:
DIMENTICAVO CHE OVVIAMENTE DEVI USARE UN WRAPPER, IGNORANTE
CI SONO DIPENDENCE LEGACY NEL PROGETTO
Non sei abbastanza enterprise :lkof:
guarda, è un po' come dire che per compilare un codice C è necessario un cric idraulico. :asd:
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:
Citazione di: sgnablo il 07 Giugno 2013, 21:40:40
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:
What about using Perl
everyone hates perl
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?
Mi sa tanto che per risolverti il problema ti dobbiamo fare una fattura :asd:
Citazione di: Mr. White il 13 Giugno 2013, 11:40:11
Mi sa tanto che per risolverti il problema ti dobbiamo fare una fattura :asd:
Nchia del bordello zì
Citazione di: Buntolo il 13 Giugno 2013, 12:53:31
Citazione di: Mr. White il 13 Giugno 2013, 11:40:11
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?
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.
Ho trovato i singoli programmi che facciano alcune operazioni, appena posso farò lgs carrellata.
Ho trovato i singoli programmi che facciano alcune operazioni, appena posso farò lgs carrellata.
Grazie per avercelo ricordato.
@buntolo: cambia browser, please :asd:
:rotfl: :rotfl: :rotfl: :rotfl:
Consigliatemi un browser per android.
Tenete conto che odio chrome in tutte le sue forme.
Io uso Chrome in tutte le sue forme :asd:
Odi anche Dolphin? È buono al cartoccio :lki:
Ho trovato i singoli programmi che facciano alcune operazioni, appena posso farò lgs carrellata.
@buntolo: hai rotto il cazzo. Seriamente :asd:
dolphin com'è?
dolphin com'è?
dolphin com'è?
Provalo :verovero:
Che ti sei squartato il cazzo con Opera l'abbiamo capito tutti, ora fila a provare il delfino :gtfo:
:asd: :asd: :asd:
Dolphin è bellino, tra l'altro parecchio modulare.
Io uso dolphin e mi trovo abbastanza bene.
Opera mobile + Chrome
Mi trovo strabene :p
io ho smesso di usare dolphin perchè ha iniziato a crashare se usavo js attivo. e mi è dispiaciuto, perchè è il mio preferito :bye:
In realtà usavi Justin Scriber :lkof: