PDA

View Full Version : Suddividere più file in tante sottocartelle automaticamente


[EtErNiTy]
05-04-2013, 22:06
Ciao a tutti,
ho un problema nel gestire alcuni file, ho un archivio di circa 400.000 disegni e il programma che dovrebbe gestirli si blocca se all'interno della cartella sono presenti più di un tot di file.
Vorrei fare in modo che questi file vengano suddivisi in tante sottocartelle contenenti ognuna 10/20 file. Il tutto in modo del tutto automatizzato tramite un qualche script.

Qualcuno conosce qualche programma che faccia al caso mio?

Khronos
06-04-2013, 14:24
advanced renamer (http://www.advancedrenamer.com/user_guide/batchmode) lo può fare.

[EtErNiTy]
07-04-2013, 13:47
Ho provato a farlo con il programma da te citato, (a parte che se seleziono tutti i file mi da errore) ma non riesco proprio a capire come si fa far dividere i file in modo automatico in più sottocartelle....
Per. es. 100 file divisi in 10 cartelle contenenti 10 file ciascuna....

Khronos
07-04-2013, 14:32
ma devi farlo "a caso"? nel senso, qualsiasi file siano, puoi rinominarli con un numero incrementale?

x_Master_x
07-04-2013, 16:06
: x_Master_x
@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET numero_file=10
SET cartella=C:\Test Prova
SET nome_destinazione=Nome Cartella
SET n=1
SET nf=0

FOR %%f IN ("!cartella!\*.*") DO (
IF !n!==1 (
SET /A nf+=1
MD "!cartella!\!nome_destinazione!!nf!"
)
MOVE /Y "%%f" "!cartella!\!nome_destinazione!!nf!"
IF !n!==!numero_file! (
SET n=1
) ELSE (
SET /A n+=1
)
)

ENDLOCAL
ECHO OPERAZIONE COMPLETATA
PAUSE
EXIT


Cosa puoi fare con il batch ( copia lo script su un Blocco Note e salvalo con estensione .bat )

1) Scegli la cartella ( nell'esempio C:\Test Prova, le sottocartelle non verranno incluse* )
2) Scegli il nome della cartella di destinazione ( il numero è incrementale, quindi da Nome Cartella diventerà Nome Cartella1, Nome Cartella2, Nome Cartella3 etc. nella stessa posizione di C:\Test Prova )
3) Suddividere per estensione ( nell'esempio è !cartella!\*.* quindi tutti i file, lo puoi cambiare con !cartella!\*.txt per i soli file di testo )
4) Suddividere per il nome ( es. !cartella!\test*.txt cercherà tutti i file che iniziano per "test" ed hanno estensione .txt, oppure *test*.txt includerà tutti i file che hanno nel nome la parola "test". Altre combinazioni di Wildcard le trovi su Google perchè non ho voglia di stare qui a spiegarle tutte :asd: )
5) Suddividere per numero ( nell'esempio numero_file=10, quindi ogni cartella conterrà 10 file )

Ti consiglio di fare alcune prove prima di buttarti sulla cartella con 400.000 files ed eventualmente fare un backup, se hai bisogno di altre caratteristiche usa un programma apposito.

*Versione per includere tutti i file delle sottocartelle ( N.B. La struttura originaria non verrà mantenuta! )

: x_Master_x
@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET numero_file=10
SET cartella=C:\Test Prova
SET nome_destinazione=Nome Cartella
SET n=1
SET nf=0

FOR /R "%cartella%" %%F IN (*.*) DO (
SET "escludi_cartella=%%~pF"
IF "%%~pF"=="!escludi_cartella:%nome_destinazione%=!" (
IF !n!==1 (
SET /A nf+=1
MD "!cartella!\!nome_destinazione!!nf!"
)
MOVE /Y "%%F" "!cartella!\!nome_destinazione!!nf!"
)
IF !n!==!numero_file! (
SET n=1
) ELSE (
SET /A n+=1
)
)

ENDLOCAL
ECHO OPERAZIONE COMPLETATA
PAUSE
EXIT

[EtErNiTy]
07-04-2013, 17:29
ma devi farlo "a caso"? nel senso, qualsiasi file siano, puoi rinominarli con un numero incrementale?

Si posso farlo tranquillamente visto che cmq hanno nomi insensati come ADDDT005.ext (cmq grazie a advanced renamer voglio provare a rinominarli dandogli un senso)

x_Master_x

Scusa l'ignoranza, ma meglio chiedere prima di far danni...
Io devo modificare solamente la prima parte dove dice "SET .... "? oltre a sostituire la seconda parte di codice visto che mi interessano anche le sottocartelle...

per es.
SET cartella=C:\Test\
quindi
FOR %%f IN (!cartella!\*.*) DO (
diventerà
FOR %%f IN (C:\Test\\*.*) DO (

corretto?

EDIT:
ho lanciato questo script:
: x_Master_x
@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET numero_file=10
SET cartella=C:\Divers
SET nomedestinazione=NomeCartella
SET n=1
SET nf=0

FOR /R %cartella% %%F in (*.*) DO (
IF !n!==1 (
SET /A nf+=1
MD !cartella!\!nomedestinazione!!nf!
)
MOVE /Y "%%F" !cartella!\!nomedestinazione!!nf!
IF !n!==!numero_file! (
SET n=1
) ELSE (
SET /A n+=1
)
)

ENDLOCAL
ECHO OPERAZIONE COMPLETATA
PAUSE
EXIT

si presenta qualche problemino però.... il percorso dove si trovano i file è: "D:\Download cucito\ok", provando a lasciare questo percorso (usando una sotto cartella) per fare delle prove il file .bat non faceva nulla, credo per via dello spazio nel nome, infatti, provando a copiare dei file su C:\Divers lo script ha funzionato :) ma con qualche problemino....
mi ha diviso i vari file (tra cui il .bat stesso) nelle varie sottocartelle però nel farlo mi ha creato 999 cartelle vuote ovvero dalla NomeCartella1 fino alla NomeCartella999 cominciando ad inserire file dalla NomeCartella1000 in poi.... da cosa può dipendere questo problema?

p.s. grazie 10000 per lo script :)

x_Master_x
07-04-2013, 19:31
Non mettere il .bat nella stessa cartella dove operi, potrebbe andare in conflitto...
Le uniche cose da modificare sono le variabili ( SET )
Il percorso deve avere la \ alla fine come da esempio, quindi C:\Divers\
Se il percorso ha degli spazi devi modificare %cartella% in "%cartella%", ho editato il post.
Per la questione delle cartella 1000 non sò da cosa dipenda ( EDIT: Credo che dipenda dalla \ che non hai inserito alla fine della path ), ho provato con un centiaio di cartelle e non ho avuto problemi.

x_Master_x
08-04-2013, 14:28
Ho editato entrambi gli script, ho risolto il problema delle path con spazio e delle cartelle vuote in caso si usi lo script che controlla le sottocartelle.