PDA

Visualizza la versione completa : [DOS]Dimensioni cartella


23Andrea
06-07-2014, 20:47
Ciao.
Esiste un comando DOS che restituisca da dimensione totale di un albero di directory?
Ho anche fatto vari tentativi con un ciclo FOR, ma non riesco a sommare i valori :(

SET /a dim=0
FOR /r C:\Users\Nomeutente %%A IN (*) DO (
SET /a dim=%dim%+%%~zA
)
ECHO %dim%
PAUSE

:jam:
Grazie.

M.A.W. 1968
06-07-2014, 21:01
Esistono alcuni modi contorti e parzialmente funzionanti di ottenere ciò che desideri sotto DOS "puro", ma li sconsiglio. Meglio pensare ad una estensione della shell, come Windows PowerShell (http://www.powershell.it/) o TakeCommand/TCC (http://jpsoft.com/all-downloads/downloads.html), oppure ricorrere ad una utility come DU (http://technet.microsoft.com/en-us/sysinternals/bb896651) del noto Russinovich (Sysinternals).

23Andrea
06-07-2014, 21:23
Anche io avevo trovato un (diverso) DU per risolvere il problema
http://gnuwin32.sourceforge.net/packages/coreutils.htm
ma mi fa i*******e non riuscire a risolvere in semplice DOS :jam:

M.A.W. 1968
06-07-2014, 22:04
Se proprio vuoi toglierti lo sfizio, prova a modificare il tuo batch come segue:



@echo off
set tsize=0
for /r %%f in (.\*) do set /a tsize+=%%~zf
echo Dimensione: %tsize% bytes.


Personalmente sconsiglio comunque soluzioni così farraginose, in favore di tools specifici o di un semplice cambio di shell. Ovviamente il grosso problema di batch siffatti è il limite dei 32 bit per l'aritmetica intera, quindi dimensioni superiori ai fatidici 2GiB danno adito a letture non valide.

Il du che hai trovato è un port del classico comando Unix.

23Andrea
06-07-2014, 22:51
Mi sembra che l'uso di "FOR /r......%%~zf" restituisca dei risultati sballati.
Invece funziona con FOR /f:

SETLOCAL EnableDelayedExpansion
SET /a valore=0
SET /a somma=0
FOR /f "usebackq tokens=1,2,3" %%a in (`"DIR C:\Users\NomeUtente /a:-d /s /-c|FINDSTR ../../...."`) DO (
SET /a valore=%%c
SET /a somma=!somma!+!valore!
)
@ECHO !somma!
PAUSE





Ovviamente il grosso problema di batch siffatti è il limite dei 32 bit per l'aritmetica intera, quindi dimensioni superiori ai fatidici 2GiB danno adito a letture non valide.

Non lo sapevo :eek:...Questo, purtroppo, rende inutile ogni sforzo :cry:.

Grazie, comunque.

23Andrea
06-07-2014, 23:08
Infatti, ho provato a "caricare" una directory con più di 2GB di file, e ho ottenuto un risultato negativo:eek:.

Grazie ancora per l'avvertimento: nella mia ignoranza, sarei impazzito per trovare la causa del problema.

Per l'appunto il batch in questione mi serviva per "misurare" cartelle di grandi dimensioni: proverò ad utilizzare un "DU".

M.A.W. 1968
06-07-2014, 23:21
Mi sembra che l'uso di "FOR /r......%%~zf" restituisca dei risultati sballati.


Vedi sopra. La ricorsione nel comando FOR funziona perfettamente: gli errori sono dovuti al fatto che la shell usa variabili segnate a 32 bit, da cui il limite di 2GiB. La forma /f attua addirittura un parsing, ed è ancora più farraginosa e complessa... ma non risolve in alcun modo il problema. Per questo non posso che ribadire il consiglio fondamentale: usare un tool CLI apposito, oppure passare ad una shell alternativa che non abbia tali limiti.

23Andrea
07-07-2014, 17:00
Come consigliato dall'amico M.A.W. 1968, ho provato due tools:
http://gnuwin32.sourceforge.net/packages/coreutils.htm (Du.exe è contenuto nel pacchetto coreutils)
http://technet.microsoft.com/en-us/sysinternals/bb896651

ma ottengo risultati discordanti.
Per esempio:

C:\Users\<nome utente>\Desktop

Esplora risorse:
Dimensioni: 115.952.632 byte
Su disco: 118.894.592 byte

Du (Sysinternals):
Size: 115.962.948 bytes
Size on disk: 119.329.168 bytes

Du (gnuwin32)
116460536 (bytes)

:bhò:
Quale sarà il valore attendibile?

M.A.W. 1968
07-07-2014, 22:25
Quale sarà il valore attendibile?

Non è banale determinarlo. Un file system come NTFS non rende semplice rispondere a tali domande: oltre ai file nascosti, si possono includere o meno nel conteggio le strutture di directories, si possono conteggiare i puri link simbolici o l'effettiva dimensione del file da essi referenziato, eccetera.

Questo spiega ampiamente le discrepanze: non è certo difficle contare, ma spesso il problema è stabilire esattamente cosa si vuole contare... in ogni caso, il tool di Sysinternals è sicuramente uno dei migliori in circolazione, e più documentato sui dettagli di NTFS.

23Andrea
08-07-2014, 13:09
... e più documentato sui dettagli di NTFS.

Sì, anche io ho pensato che un programma scritto per Linux, pur in una versione compatibile con Windows, sia probabilmente tarato sulle caratteristiche di un filesystem diverso da NTFS.

Loading