Newsgroup: it.hobby.fai-da-te
Titolo: Spostare e archiviare file raggruppati per mese

Non trovo una soluzione semplice al problema, sebbene io possa usare
qualsiasi strumento per risolverlo.
Ho una cartella con migliaia di file, per cui la sola apertura della
cartella, in explorer o TotalComamnder o quel che volete e' lentissima.
Devo zippare questi file raggruppati per mese. Alla fine mi devo
trovare con 0601.zip per i file di gennaio 2006, 0602.zip 0603.zip e
avanti. In ogni zip ci sono centinaia di file per ogni giorno del mese.
Anfrebbe bene anche solo spostarli via batch con move, o xcopy e del,
ma la creazione delle cartelle 0601 0602 e' macchinosa e soprattutto
poi la selezione dei file da spostare e successiva cancellazione visto
che si va ogni volta a leggere la sterminata directory.
Oltretutto ci vuole un batch che faccia tutta l'operazione in una volta
sola vista la lunghezza.
Idee?

 
come sopra.
ciao
Stefano

 Un piccolo programma scritto in vb che ti crea le cartelle e sposta
eh, da programma certo... ma io per sfizio lo volevo fare con un batch
anche se dovesse servire qualche tool tipo 7zip o xxcopy


mv /*ggmmaaa* /dove_vuoi
felice-pago
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 mv /*ggmmaaa* /dove_vuoi
hai ragione, e' quello che ci vuole, ora cerco un mv per win.


ne ho trovato uno batch, XHELP.CMD
Pertanto una soluzione, senza poi considerare il zippaggio e':
echo off
rem FOR /L %variable IN (start,step,end) DO command
[command-parameters]
rem FOR /L %%i IN (1,1,9) DO echo 060%%i
rem FOR /L %%i IN (10,1,12) DO echo 06%%i
FOR /L %%i IN (12,-1,10) DO call :ciclo %%i
FOR /L %%i IN (9,-1,1) DO call :ciclo 0%%i
goto :EOF
:ciclo
echo %1
md 06%1
rem xcopy documenti\*.* 06%1 /D:%1-1-2006
call xbydate move documenti GEQ 2006%101 06%1
goto :EOF
dove uso XBYDATE.CMD che a sua volta usa XHELP.CMD:
@echo off
::
:: %~dpnx0
::
:: %%1 is command:  list, copy, delete, type, move
:: %%2 is dir spec  c:\myfiles\*.txt
:: %%3 is one of the following:
::
::     LSS  - less than                the target date)
::     LEQ  - less than or equal to    the target date)
::     EQU  - equal to                 the target date)
::     GEQ  - greater than or equal to the target date)
::     GTR  - greater than             the target date)
::
:: %%4 is the target date in format yyyymmdd
:: %%5 is the destination (for copy and move only)
::
:: example:  %~n0 list c:\cmd\txt\*.pkg LEQ 20000501
::
::           %~n0 type c:\cmd\txt\*.txt GTR 19990801
::
if "%1"==""  (
call xhelp %~dpnx0
goto :EOF
)
if "%1"=="?" (
call xhelp %~dpnx0
goto :EOF
)
if "%1"=="/?" (
call xhelp %~dpnx0
goto :EOF
)
setlocal
::-------------------------------------------
:: validate the compare-op and convert it to
:: upper case
::-------------------------------------------
set comp=unknown
for %%a in (LSS LEQ EQU GEQ GTR) do (
if /i "%%a"=="%3" set comp=%%a
)
if "%comp%"=="unknown" (
echo invalid compare-op "%3"
call xhelp %~dpnx0
goto :EXIT
)
::-------------------------------------------
:: validate the command
::-------------------------------------------
set mycommand=unknown
for %%a in (MOVE COPY DELETE LIST TYPE) do (
if /i "%%a"=="%1" set mycommand=%1
)
if "%mycommand%"=="unknown" (
echo invalid command %1
call xhelp %~dpnx0
goto :EXIT
)
set cd=
set mycommand=%1
set dirspec=%2
set sourcepath=%~dp2
set cutoff_date=%4
set destination=%5
for /f "tokens=* delims= " %%* in (
'dir /a-d %dirspec% ^| find "/"'
) do call :main %%*
:EXIT
endlocal
goto :EOF
:main
set dirdata=%*
if not defined cd set dirdata=%dirdata:~1%
for /f "tokens=1-3 delims=/" %%a in (
"%dirdata:~0,8%"
) do (
set fileyear=%%c
set filemonth=%%a
set fileday=%%b
)
if 1%fileyear% GTR 150 (
set fileyear=19%fileyear%
) else (
set fileyear=20%fileyear%
)
if "%fileyear%%filemonth%%fileday%" %comp% "%cutoff_date%" (
call :EXECUTE
)
goto :EOF
:EXECUTE
if /i "%mycommand:~0,4%"=="list" (
echo %dirdata:~0,38% %sourcepath%%dirdata:~39%
goto :EOF
)
if /i "%mycommand:~0,4%"=="copy" (
copy "%sourcepath%%dirdata:~39%" %destination% > nul
echo "%sourcepath%%dirdata:~39%" copied to %destination%
goto :EOF
)
if /i "%mycommand:~0,4%"=="type" (
echo>%temp%\~flist.cmd @echo off
echo>>%temp%\~flist.cmd title %sourcepath%%dirdata:~39%
echo>>%temp%\~flist.cmd more /e "%sourcepath%%dirdata:~39%"
echo>>%temp%\~flist.cmd echo @@@@@@@ press any key to continue @@@@@@@
echo>>%temp%\~flist.cmd pause ^> nul
echo>>%temp%\~flist.cmd cls
echo>>%temp%\~flist.cmd exit
start /wait cmd /c %temp%\~flist.cmd
goto :EOF
)
if /i "%mycommand:~0,6%"=="delete" (
echo DELETED "%sourcepath%%dirdata:~39%"
del "%sourcepath%%dirdata:~39%"
goto :EOF
)
if /i "%mycommand:~0,4%"=="move"   (
move "%sourcepath%%dirdata:~39%" %destination% > nul
echo "%sourcepath%%dirdata:~39%" moved to %destination%
goto :EOF
)
goto :EOF
:EOF
---------------------------------------------
XHELP.CMD:
@echo off
setlocal
set whichfile=%1
set fname=%~n1
for /f "tokens=* delims=" %%* in (
'findstr /b /c:"::" %whichfile%') do call :display %%*
endlocal& goto :EOF
:display
set line=%*
set line=%line:~2%
call :exec set line=%%line:^%~n0=%fname%%%
echo %line% 
goto :EOF 
:exec 
%* 
goto :EOF 
:EOF

Troppo lento e troppo complesso da aggiustare. Ho pensato che e' molto
piu' diretta ed efficace la soluzione di prendere i file uno alla volta
e spostarli ciascuno nella sua cartella cosi':
echo off
for %%i IN (%1) do call :ciclo %%i %%~ti
goto :EOF
:ciclo
for /f "tokens=1-3 delims=/" %%a in (
"%2"
) do (
set fileyear=%%c
set filemonth=%%b
set fileday=%%a
)
set fileyear2=%fileyear:~2,2%
move %1 %fileyear2%%filemonth%
echo ----------------------------------------------------
goto :EOF
dopo aver brutalmente creato le cartelle cosi':
echo off
FOR /L %%j IN (6,-1,4) DO call :cicloanni %%j
goto :EOF
:cicloanni
FOR /L %%i IN (12,-1,10) DO call :ciclo %%i %1
FOR /L %%i IN (9,-1,1) DO call :ciclo 0%%i %1
goto :EOF
:ciclo
md 0%2%1
goto :EOF
FATTO! Sta girando.... vediamo se domattina ha finito :-)

e spostarli ciascuno nella sua cartella cosi':
Scusa, forse non ho capito il problema, ma un semplice:
move C:\cartella1\*.* cartella2
thy

 t> Scusa, forse non ho capito il problema, ma un semplice:
 t> move C:\cartella1\*.* cartella2
Eh, magari, i file sono tutti insieme, io li devo selezionare raggruppati 
per mese e mettere in cartelle (o archivi) separati.
L'unico cmd che consente la selezione per data e' xcopy, ma cosi' non c'e' 
verso di spostarli o cancellare i file di origine, una grave lacuna dei 
sistemi dos e windows.
Pero' la mia ultima soluzione ha funzionato perfettamente ed ha completato 
l'opera in tempi ragionevoli (decine di migliaia di file).
-- 
http://www.frappr.com/ithobbyfaidate
 

"Mike"

Cerca e scarica, se non lo hai già fatto il pkzip per batch, cioè per il 
DOS. Con le opzioni -t e -T riesci a selezionare i files per data, es.:
pkzip 0706.zip  -t01072006 -T31072006 zippa i files che hanno data >= 
01/07/2006 E (condizione AND) minore del 31/07/2006
Puoi poi automatizzare utilizzando un file .bat complicando e 
parametrizzando il tutto quanto vuoi...
ciao
d
-- 
------------------------------------------------------
my aussie on line 
http://www.d--p.net/albummelody
 :o)
------------------------------------------------------ 

 parametrizzando il tutto quanto vuoi...
Due note aggiuntive:
- la seconda data (-T) lavorando per minore esclude i file della data 
stessa, devi perciò indicare il giorno successivo.
- ho visto ora che i file zippati prendono i nomi corti. Io ho usato per le 
prove un vecchio pkzip dos che avevo, magari un versione più aggiornata 
mantiene i nomi lunghi.
riciao


 mantiene i nomi lunghi.
Sai, era sostanzialmente questa la mia paura usando il pkzip. Forse la
command line del 7zip lo fa, devo controllare. Son comunque contento di
aver messo insieme il batch, quello funziona senza installare niente.

aver messo insieme il batch, quello funziona senza installare niente.
Ho fatto altre prove, funziona correttamente anche con i nomi lunghi.


 Ho fatto altre prove, funziona correttamente anche con i nomi lunghi.
Ah ok, quindi
pkzip 0706.zip  -t01072006 -T01082006
poi da batch posso fare il ciclo sui mesi come prima.
ma devo anche dirgli di fare il "move" e di porre la data di modifica
del zip alla data del file compresso piu' recente.... bon comunque se
non da problemi con il filesystem e' sicuramente la soluzione migliore
che provo subito.

> pkzip 0706.zip  -t01072006 -T01082006
ehm ma che versione di pkzip devo scaricare?
... e poi perche' 7zip non ha la selezione per data??


provo con PK250DOS.EXE


Sě, quella va bene.
se guardi l'help (PKZIP /? e poi 2 , 3, 4 per vedere le pagine successive)
 ad un certo punto dice che l'opzione "-o          set .ZIP file date to the 
latest file in .ZIP file"
dovrebbe fare al caso tuo. Ci sono molte altre opzioni, mi sembra che la -d 
cancella i files zippati ecc.


 ecc.
No l'opzione -d cancella i files DAL file .zip
qui 
http://www.uwm.edu/~dtoth/pkzip.html
trovi la spiegazione e gli esempi di tutte le opzioni che, tra l'altro, con 
la versione 2.50 poi anche usare con una nomenclatura un piů umana:
http://www.uwm.edu/~dtoth/pkzip.html#commandtrans
spero di esseti stato utile.
ciao
dario


 spero di esseti stato utile.
come no? -m -o -t -T risolve brillantemente il problema, il problema
era identificare questo: PK250DOS.EXE il resto e' semplice


Scusate se mi intrometto nella discussione. 
Nel caso venga introdotta la password, il livello di criptazione del
file e' sicura (cioe' non crackabile) oppure e' meglio criptare il
file con programmi appositi?
Grazie
lallo

 lallo
Prova a leggere questo 
http://www.woodmann.com/crackz/Tutorials/Zipcrkct.htm
ciao
d
