Se puede hacer un batch que tome todos los archivos (css, html, etc...) ¿Y deje solo las primeras y ultimas 20 líneas?

Buenos días/tardes/noches... Tengo al rededor de 7300 archivos en una carpeta de una plataforma enorme, ¿y resulta que para registrar me piden un formato que debo entregar cada archivo con las primeras y ultimas 20 líneas... Se puede crear un batch que me permita ejecutar esta tarea? ¿Alguna idea?

1 respuesta

Respuesta

Creo que sí, pero todavía no lo tengo listo. Me baso en el comando

FIND /V /C "" <nombre de archivo>

Para obtener el número de líneas. Si son menos de 40 no hay que hacer nada, si son más con un FOR contando líneas extraigo las 20 primeras y con un FOR SKIP me salto todas menos las 20 últimas. Pero todavía no me funciona.

Otra cosa, hay archivos (AVI, JPG, etc.) para los que el número de líneas no tiene sentido. ¿Deben excluirse o hay garantías de que no habrá archivos de ese tipo en la carpeta a tratar?

El fin de semana tengo difícil poder ocuparme de esto. Te tendré al tanto.

Al final sí que pude dedicarle un tiempo a este asunto. Creo que este BAT puede hacer lo que quieres:

@echo off
Setlocal EnableDelayedExpansion
set carporig=d:\carpeta prueba
set carpdest=d:\temp\carpeta prueba
set /a nlind=20
set /a nlint=20
set /a nltot=nlind+nlint
set prefijo=nlin
cd %carporig%
for /f "tokens=*" %%a in ('dir /b /a-d') do (
   for /f "tokens=*" %%x in ('type "%%a" ^|find /v /c ""') do (
      if %%x gtr %nltot% (call :tratarch "%%a" %%x
         ) else copy /y "%%a" "%carpdest%\%prefijo%_%%a">nul
      )
   )
goto :eof
:tratarch
set /a lin=1
del /q "%carpdest%\%prefijo%_%~1">nul 2>&1
for /f "tokens=*" %%l in ("%~1") do (
   if !lin! leq %nlind% (echo echo %%l>>"%carpdest%\%prefijo%_%~1"&set /a lin+=1)
   if !lin! gtr %nlind% goto :seguir
   )
:seguir
set /a saltalin=%2 - %nlint%
for /f "skip=%saltalin% tokens=*" %%l in ("%~1") do echo %%l>>"%carpdest%\%prefijo%_%~1"
goto :eof

He establecido unas variables de trabajo:

Carporigen: carpeta de origen de los archivos a tratar
carpdest: carpeta de destino donde dejar los archivos "extraídos"
Nlind: número de líneas a extraer de la parte "delantera"
Nlint: número de líneas a extraer de la parte "trasera"
Nltot: número total de líneas a extraer
prefijo: prefijo a añadir al nombre del archivo original para crear el archivo extraído
lin: número de línea que se está tratando de la parte delantera
saltalin: número de líneas a saltar para situarse en el inicio de la parte trasera

Ajusta esas variables a tus necesidades y prueba a ver si te funciona. Imagino que para 7300 archivos puede tardar mucho de modo que te sugiero que hagas una prueba a pequeña escala y si funciona tomes tiempos para hacerte una idea. Si algo no va bien o no va como necesitas me lo cuentas. Si hay errores ponlos por aquí.

Perdón. Hay algunos errores en mi bat. Usa este en su lugar:

@echo off
Setlocal EnableDelayedExpansion
set carporig=d:\carpeta prueba
set carpdest=d:\temp\carpeta prueba
set /a nlind=20
set /a nlint=20
set /a nltot=nlind+nlint
set prefijo=nlin_
cd %carporig%
for /f "tokens=*" %%a in ('dir /b /a-d') do (
   for /f "tokens=*" %%x in ('type "%%a" ^|find /v /c ""') do (
      if %%x gtr %nltot% (call :tratarch "%%a" %%x
         ) else copy /y "%%a" "%carpdest%\%prefijo%%%a">nul
      )
   )
goto :eof
:tratarch
set /a lin=1
del /q "%carpdest%\%prefijo%%~1">nul 2>&1
for /f "tokens=*" %%l in ('type "%~1"') do (
   if !lin! leq %nlind% (echo %%l>>"%carpdest%\%prefijo%%~1"&set /a lin+=1)
   if !lin! gtr %nlind% goto :seguir
   )
:seguir
set /a saltalin=%2 - %nlint%
for /f "skip=%saltalin% tokens=*" %%l in ('type "%~1"') do echo %%l>>"%carpdest%\%prefijo%%~1"
goto :eof

¿Qué pasó con esto? ¿Probaste el BAT?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas