2010-11-14 42 views
20

Tengo algún proceso que crea algunos archivos de tamaño de 0 KB en un directorio y sus subdirectorios.
¿Cómo puedo eliminar los archivos del sistema de archivos usando el símbolo del sistema de Windows?
Cualquier comando individual o script que hará la tarea funcionará. Eliminar recursivamente archivos de 0 KB mediante Windows cmd


Solo puedo ejecutar comandos y scripts cmd sencillos, trabajando en una máquina remota con acceso restringido.

+1

¿Qué versión de Windows? Muchas versiones de Windows incluyen VBScript, que podría ser más flexible ... http://www.suite101.com/content/windows-scripting-command-line-vbscript-a83052 – Klinky

+0

Usaría 'for' para escanear el árbol de directorios en busca de archivos , 'findstr' para buscar archivos para"."patrón y elimine aquellos que no coinciden." – Constantin

Respuesta

42
  1. Iterar sobre los archivos de forma recursiva:

    for /r %F in (*) 
    
  2. Descubre los archivos de longitud cero:

    if %~zF==0 
    
  3. los borre:

    del "%F" 
    

Poniendo todo junto:

for /r %F in (*) do if %~zF==0 del "%F" 

Si necesita esto en un archivo por lotes, entonces usted necesita para duplicar el %:

for /r %%F in (*) do if %%~zF==0 del "%%F" 

Nota: estaba asumiendo que significaba archivos de exactamente 0 bytes de longitud. Si con 0 KB quiere decir algo menos de 1000 bytes, entonces por encima de if necesita leer if %~zF LSS 1000 o cualquiera que sea su umbral.

+0

hmm que funcionó :) – crodjer

+1

(Para completar) Mismo comando para apagar la salida: http: // stackoverflow. com/a/18014912/2436175 – Antonio

+0

Use '@ if' si desea suprimir la impresión de la declaración if para cada archivo – Kip

-1

Puede probar find.exe en el UnxUtils.

find . -type f -empty -delete 
+0

No es útil para este propósito .... trabajando en una máquina remota ... por lo que no hay acceso directo. Solo se pueden ejecutar comandos y scripts de cmd. – crodjer

+0

Creo que esta respuesta no debería haber sido down-voting. Todavía proporciona un poco de información útil, probablemente para contextos ligeramente diferentes. Votó para neutralizarlo. – crodjer

2
@echo off 
setLocal EnableDelayedExpansion 
for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do (
if %%~Za equ 0 del "%%a" 
) 

encontrar en: link text parece funcionar, con una advertencia: No va a eliminar archivos con nombres que contengan espacios. Puede haber una solución alternativa, pero me temo que el lote no es mi fuerte.

+0

Bueno, ya que explícitamente declara que el espacio es un delimitador de fichas' for' * will * tokenize. Supongo , 'del" %% a %% b "' debería funcionar, pero la respuesta real es que nunca se debe usar 'for/f' sobre la salida de' dir' a menos que sea absolutamente necesario (por ejemplo, para ordenar). 'for 'en sí mismo puede iterar ove r archivos y es mucho más robusto de esa manera. Por ejemplo, su solución no manejará nombres de archivos que contengan caracteres Unicode sin representación en la página de códigos OEM, si se seleccionan fuentes Raster para la ventana de la consola. Esas interacciones son sutiles, pero tiendo a estar muy lejos de 'for/f' para nombres de archivos – Joey

0

Esto funciona bien cuando se corrige un error. El problema era una tilde faltante (~) por ejemplo, del "%% a" debe ser del "%% ~ a"

Esto eliminará los archivos con espacios en el nombre porque encierra el token en "doble comillas" - un método alternativo sería utilizar 'nombre corto' como se muestra en el segundo ejemplo [%% ~ sa

@echo off setlocal EnableDelayedExpansion para/f "tokens = * delims =" %% a en ('dir/s/b/a-d') hacer ( si %% ~ Za equ 0 del "%% ~ un" )

@echo off setlocal EnableDelayedExpansion de "tokens = * delims ="/f %% una introducción ('dir/s/b/a-d') hacer ( si %% ~ Za equ 0 del %% ~ sa )

Cuestiones relacionadas