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
スニャブロ 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."

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
スニャブロ 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."

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:
スニャブロ 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."

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
スニャブロ 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."

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.

Con calma, tanto oggi vado via (in in 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.
J:
unita' 4/1981
comp: 7.99%

Consecutivi per forza? Sono ad minchiam ma  in ordine crescente, pensavo di sfruttare os.walk o os.listdir