*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Rinomina di massa
« il: 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

*

Offline TonyWhite

  • Apostolo dello SPAM
  • ********
  • 31.568
  • 191
    • Se proprio non hai un cazzo da fare...
Re:Rinomina di massa
« Risposta #1 il: 06 Giugno 2013, 11:57:52 »
Una volta ho usato bulk-rename o qualcosa di simile su linux.

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #2 il: 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).

*

Offline TonyWhite

  • Apostolo dello SPAM
  • ********
  • 31.568
  • 191
    • Se proprio non hai un cazzo da fare...
Re:Rinomina di massa
« Risposta #3 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.

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #4 il: 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.

*

Offline TonyWhite

  • Apostolo dello SPAM
  • ********
  • 31.568
  • 191
    • Se proprio non hai un cazzo da fare...
Re:Rinomina di massa
« Risposta #5 il: 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.

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #6 il: 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

*

Offline sgnablo

  • Tiranno Democratico
  • *******
  • 16.609
  • 249
  • [rimosso dallo staff]
Re:Rinomina di massa
« Risposta #7 il: 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
スニャブロ ufficiale del forum
pulsantoni pulsantosi per greasemonkey: http://bubs.altervista.org/index.php?topic=4.msg183#msg183
script greasemonkey anti-ads: http://bubs.altervista.org/index.php?topic=6.msg2581#msg2581

I miei vaneggi pseudodisegnosi: http://sgnafp.deviantart.com/

"Speed never killed anyone, suddenly becoming stationary, that's what gets you."

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #8 il: 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

*

Offline sgnablo

  • Tiranno Democratico
  • *******
  • 16.609
  • 249
  • [rimosso dallo staff]
Re:Rinomina di massa
« Risposta #9 il: 06 Giugno 2013, 15:10:04 »
giusto, devi fare

cp ./orig/i  ./spostati/$dest
スニャブロ ufficiale del forum
pulsantoni pulsantosi per greasemonkey: http://bubs.altervista.org/index.php?topic=4.msg183#msg183
script greasemonkey anti-ads: http://bubs.altervista.org/index.php?topic=6.msg2581#msg2581

I miei vaneggi pseudodisegnosi: http://sgnafp.deviantart.com/

"Speed never killed anyone, suddenly becoming stationary, that's what gets you."

*

Offline TonyWhite

  • Apostolo dello SPAM
  • ********
  • 31.568
  • 191
    • Se proprio non hai un cazzo da fare...
Re:Rinomina di massa
« Risposta #10 il: 06 Giugno 2013, 16:23:29 »
Non riesco nemmeno a scrivere un ciclo >:(
Chiedo delucidazioni in un altro topo

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #11 il: 06 Giugno 2013, 17:31:07 »
cp: cannot stat `./orig/i': No such file or directory

*

Offline sgnablo

  • Tiranno Democratico
  • *******
  • 16.609
  • 249
  • [rimosso dallo staff]
Re:Rinomina di massa
« Risposta #12 il: 06 Giugno 2013, 23:37:26 »
fanculo, è ./orig/$i

:facepalm:


questo succede quando fai codice senza provarlo, scrivendolo direttamente nel browser :asd:
スニャブロ ufficiale del forum
pulsantoni pulsantosi per greasemonkey: http://bubs.altervista.org/index.php?topic=4.msg183#msg183
script greasemonkey anti-ads: http://bubs.altervista.org/index.php?topic=6.msg2581#msg2581

I miei vaneggi pseudodisegnosi: http://sgnafp.deviantart.com/

"Speed never killed anyone, suddenly becoming stationary, that's what gets you."

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #13 il: 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... >:(

*

Offline sgnablo

  • Tiranno Democratico
  • *******
  • 16.609
  • 249
  • [rimosso dallo staff]
Re:Rinomina di massa
« Risposta #14 il: 07 Giugno 2013, 00:21:18 »
naaa non è necessario, davvero. bash è molto potente
スニャブロ ufficiale del forum
pulsantoni pulsantosi per greasemonkey: http://bubs.altervista.org/index.php?topic=4.msg183#msg183
script greasemonkey anti-ads: http://bubs.altervista.org/index.php?topic=6.msg2581#msg2581

I miei vaneggi pseudodisegnosi: http://sgnafp.deviantart.com/

"Speed never killed anyone, suddenly becoming stationary, that's what gets you."

*

Offline TonyWhite

  • Apostolo dello SPAM
  • ********
  • 31.568
  • 191
    • Se proprio non hai un cazzo da fare...
Re:Rinomina di massa
« Risposta #15 il: 07 Giugno 2013, 07:51:40 »
Questo è 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.

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #16 il: 07 Giugno 2013, 08:07:44 »
Con calma, tanto oggi vado via (in in posto molto

*

Offline Cire

  • Utente più fastidioso del foro, ben più di Sacco
  • ********
  • 29.505
  • 92
  • Ogni donna sogna un pezzo di Cire
    • Netline Blog
Re:Rinomina di massa
« Risposta #17 il: 07 Giugno 2013, 08:51:55 »
Bello il posto molto.

*

Offline the_original_g

  • ******
  • 7.618
  • 104
  • シェモキレッジェ
Re:Rinomina di massa
« Risposta #18 il: 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.
J:
unita' 4/1981
comp: 7.99%

*

Offline Buntolo

  • Quello che si ostina ad usare Opera Mobile nonostante gli raddoppi i post
  • ******
  • 10.327
  • 41
Re:Rinomina di massa
« Risposta #19 il: 07 Giugno 2013, 09:31:28 »
Consecutivi per forza? Sono ad minchiam ma  in ordine crescente, pensavo di sfruttare os.walk o os.listdir