Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: naobradovich en 19 Agosto 2016, 19:15 pm



Título: Contar y mover Archivos con BAT
Publicado por: naobradovich en 19 Agosto 2016, 19:15 pm
Buenas Buenas....!!  :D :D
Ya hace varios dias estoy leyendo,e intentando de armarme algo que no me sale para nada, o tengo ideas sueltas, pero no las puedo unificar. :-( :-(
Como dice el titulo necesito crear un bat para contar solo mil archivos formato out dentro de una carpeta con 50 mil y mover estos mil archivos a otra carpeta. 
Si no es muy difícil, ademas me gustaría que se muevan primero los archivos mas antiguos, si no con lo otro estoy mas que feliz!!!! ;D ;D

Desde ya muchísimas gracias


Título: Re: Contar y mover Archivos con BAT
Publicado por: Eleкtro en 19 Agosto 2016, 22:30 pm
Somos generosos y ayudamos, pero no hacemos el trabajo de nadie por que no somos las hermanitas de la caridad. Ni siquiera has mostrado un código que demuestre que al menos lo hayas intentado hacer por ti mismo.

Con el comando ForFiles puedes listar los archivos de un directorio para obtener la fecha de creación/modificación y el nombre completo, el problema es que para una cantidad grande como 50.000 archivos entonces no te merece la pena hacerlo en Batch, es demasiado lento y engorroso, por ese motivo te mostraré una solución en otro lenguaje soportado nativamente por Windows...

El siguiente script lo he desarrollado en PowerShell, lo que hace es listar los archivos de un directorio según la extensión de archivo especificada, ordenar los archivos por la última fecha de modificación de cada uno, y mover los primeros 1.000 archivos con más antiguedad al directorio de destino:

Código
  1. $srcDir = "C:\Source\"
  2. $dstDir = "C:\Destination\"
  3. $ext = "txt"
  4. $max = 1000
  5.  
  6. Get-ChildItem -Path $srcDir -Filter "*.$($ext)" -Force |
  7. sort LastWriteTime | select -first $max |
  8. ForEach-Object {
  9. Move-Item -Path $_.FullName -Destination $dstDir -Force
  10. Write-Host "$($_.FullName) -> $($dstDir)$($_.Name)"
  11. }
  12.  
  13. Write-Host "Press any key to exit..."
  14. $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

EDITO:
...O como a mi me gusta desenvolverme, con la librería de classes de .NET:
Código
  1. # User fields
  2. $srcDir = "C:\Source\"
  3. $dstDir = "C:\Destination\"
  4. $ext    = "txt"
  5. $max    = 1000
  6.  
  7. # .NET Framework Classes
  8. $CON  = [System.Console]
  9. $DIR  = [System.IO.Directory]
  10. $PATH = [System.IO.Path]
  11. $LINQ = [System.Linq.Enumerable]
  12.  
  13. # LINQ's Key-selector functions
  14. $fileFunc = [Func[string, [System.IO.FileInfo]]]{ param($filepath) $filepath }
  15. $sortFunc = [Func[[System.IO.FileInfo], [System.DateTime]]]{ param($file) $file.LastWriteTime }
  16.  
  17. $files = $LINQ::Select($DIR::GetFiles($srcDir, "*.$($ext)", 0), $fileFunc)
  18. $group = $LINQ::Take($LINQ::OrderBy($files, $sortFunc), $max)
  19.  
  20. foreach ($file in $group) {
  21.    $dstFullname = $PATH::Combine($dstDir, $file.Name)
  22.    $CON::WriteLine("$($file.FullName) -> $($dstFullname)")
  23.    $file.MoveTo($dstFullname)
  24. }
  25.  
  26. $CON::WriteLine("Press any key to exit...")
  27. $CON::ReadKey($true)

Saludos


Título: Re: Contar y mover Archivos con BAT
Publicado por: tincopasan en 20 Agosto 2016, 01:14 am
Elektro:
            sin ánimo de ofenderte pero estaría bueno que seas coherente con  tus palabras.
Citar
Somos generosos y ayudamos, pero no hacemos el trabajo de nadie por que no somos las hermanitas de la caridad. Ni siquiera has mostrado un código que demuestre que al menos lo hayas intentado hacer por ti mismo.

naobradovich : como muy bien te han dicho estaría bueno que hagas un código y plantees tus dudas. También es cierto que sería mejor hacerlo en algún lenguaje de script más poderoso que el simple .bat, podría ser además vbscript(también nativo de windows) o python, inclusive cualquier otro, Ruby, perl,etc. sería cuestión que elijas un lenguaje más completo.


Título: Re: Contar y mover Archivos con BAT
Publicado por: Eleкtro en 20 Agosto 2016, 02:12 am
Elektro:
            sin ánimo de ofenderte pero estaría bueno que seas coherente con  tus palabras.

Soy coherente y también consciente de lo que intentas decirme, en realidad me estás llamando hipócrita de una forma sutil :xD, no me ofende y es comprensible que pienses así puesto que en este tipo de preguntas yo la primera vez advierto pero también ayudo (todo el mundo se merece que le expliquen y hagan una excepción la primera vez para darle una segunda oportunidad de hacer las cosas bien hechas en el futuro), ahora, si esa persona vuelve a publicar por segunda vez una pregunta igual de VAGA pidiéndolo todo hecho ...te aseguro que directamente ni le responderé.

Saludos!