Eliminar contenido de carpetas con el mismo nombre en diferentes subdirectorios

Eliminar contenido de carpetas con el mismo nombre en diferentes subdirectorios

Estoy usando Windows 10.

Tengo muchas carpetas con el mismo nombre (supongamos que el nombre "datos") en diferentes subdirectorios de un directorio base (aquí "d:\dir").

¿Cómo puedo eliminar el contenido (que contiene solo archivos) de todas las carpetas denominadas "datos" sin eliminarlas?

Por ejemplo, para tres carpetas:

d:\dir\datos
d:\dir\tmp1\datos
d:\dir\tmp3\tmp2\datos

Respuesta1

Desde una ventana del símbolo del sistema de Windows, se puede utilizar la siguiente línea de comando para eliminar solo todos los archivos (no las carpetas) en todos datalos directorios D:\diry sus subdirectorios:

for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"

La misma línea de comando se escribiría de la siguiente manera en un archivo por lotes de Windows:

@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"

El comandoPARAse ejecuta en un proceso de comando separado iniciado con %ComSpec% /Cla línea de comando en segundo plano:

dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"

La variable de entorno ComSpecgeneralmente se define como %SystemRoot%\System32\cmd.exese puede ver al mirar elsistemavariables de entorno en WindowsPanel de control - Sistema - Configuración avanzada del sistema - Variables de entorno.... La variable de entorno SystemRootse define de forma predeterminada con la ruta al directorio de Windows. En otras palabrasPARAse ejecuta de forma predeterminada en la mayoría de las PC con Windows C:\Windows\System32.execon la opción /Cy la línea de comando especificada entre ('y '). Véase también el artículo de Wikipedia con una lista de predefinidos.Variables de entorno de Windows.

El comandodirecciónsalidas para manejarSALIDA ESTÁNDAR(salida estándar)

  • en formato desnudo debido a la opción/B
  • solo nombres de directorios debido a la opción /AD(directorio de atributos)
  • con ruta completa debido a la opción/S
  • coincidente con el patrón comodín*data
  • en el directorio especificadoD:\dir
  • y todos sus subdirectorios también gracias a la opción /S.

direccióngeneraría un mensaje de error para manejarESTDERR(error estándar) en ninguna entrada del directorio que coincida con estos criterios. Este mensaje de error se suprime redirigiéndolo al dispositivoNULcon 2>nul.

Entonces la salida dedirecciónes por ejemplo dado:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

La salida dedirecciónmanejarSALIDA ESTÁNDARes redirigido con |para manejarESTDIN(entrada estándar) del siguiente comandoENCONTRARSTR.

ENCONTRARSTRbúsquedas en flujo leído desdeESTDINlinea por linea

  • no distingue entre mayúsculas y minúsculas debido a la opción/I
  • la cadena interpretada literalmente\data
  • que debe encontrarse al final de una línea debido a la opción /E.

EntoncesENCONTRARSTRsalidas para manejarSALIDA ESTÁNDARdel comando en segundo plano procesa todas las líneas \dataal final de la línea, que es para el ejemplo dado nuevamente:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

Filtrado de salida del comandodirecciónconENCONTRARSTRes necesario excluir un directorio con un nombre similar MyDataal que también generadireccióndebido al comodín *que se requiere para obtener no todos los subdirectorios de D:\dir\datay sus subdirectorios, sino todos datalos directorios de D:\diry sus subdirectorios.

Lea el artículo de Microsoft sobreUso de operadores de redirección de comandospara una explicación de 2>nuly |. Los operadores de redirección >y |deben tener carácter de escape con carácter de intercalación ^enPARALa línea de comando se interpretará como caracteres literales cuando el intérprete de comandos de Windows procese esta línea de comando antes de ejecutar el comando.PARAque ejecuta la dirlínea de comando incorporada en un proceso de comando separado iniciado en segundo plano.

PARAcon opción /Fcaptura todo el resultado finalmente para manejarSALIDA ESTÁNDARdel proceso de comando iniciado y procesa esta salida línea por línea después de la terminación de iniciado cmd.exe.

Las líneas vacías siempre son ignoradas porPARA, pero no hay líneas vacías generadas pordirecciónyENCONTRARSTR.

PARATambién ignora de forma predeterminada todas las líneas que comienzan con a, ;que es el carácter predeterminado de final de línea. Pero todas las líneas capturadas porPARAEn este caso, nunca comience con punto y coma porque todas las líneas comienzan con D:. Por lo tanto, eol=;se puede mantener el valor predeterminado . De lo contrario, eol=|suele ser lo mejor para procesar una lista de nombres de archivos/carpetas, ya que ningún nombre de archivo/carpeta puede contener la barra vertical.

PARAdividiría de forma predeterminada cada línea en subcadenas usando el espacio normal y el carácter de tabulación horizontal como delimitadores de cadena y asignaría solo la primera cadena separada por espacios/tabulaciones a la variable de bucle especificada I. El nombre de una carpeta en la ruta de un datadirectorio podría contener un carácter de espacio. Por esa razón, se especifica una lista vacía de delimitadores delims=que deshabilita el comportamiento de división de líneas, lo que resulta en que a la variable de bucle se le asigne Isiempre el nombre completo completo de una datacarpeta encontrada.

PARAse ejecuta para cada datadirectorio asignado al Icomando:

del /A /F /Q "%I\*"

%Ise reemplaza antes de la ejecución deDELpor nombre de directorio completo asignado actualmente a la variable de bucle I.

El comandoDELes para borrar archivos. No elimina directorios. La opción /Ase utiliza para eliminar todos los archivos independientemente de sus atributos, incluidos los archivos con un conjunto de atributos ocultos queDELNo eliminaría sin opción /A. La opción /Fes necesaria para forzar también la eliminación de un archivo con un conjunto de atributos de solo lectura que no se eliminaría sin la opción /F. La opción /Qse utiliza para suprimir la consulta que pregunta al usuario si realmente todos los archivos que coinciden *deben ser eliminados porDEL.

El nombre completo del directorio debe estar entre comillas dobles porque podría contener un espacio o uno de estos caracteres &()[]{}^=;!'+,`~que requiere el uso de "una cadena de argumentos de un comando como se explica en la ayuda deCMD en la última página de ayuda que aparece al ejecutarse en una ventana del símbolo del sistema cmd /?.

Tenga en cuenta queDELNo se pueden eliminar archivos en los que el usuario no tiene permisos NTFS para eliminar archivos o que están abiertos actualmente por una aplicación de una manera que impide la eliminación del archivo mientras la aplicación lo abre.DELgenera un mensaje de error para cada archivo que no se puede eliminar debido a que faltan permisos de acceso a archivos o NTFS.

Para comprender los comandos utilizados y cómo funcionan, abra una ventana del símbolo del sistema, ejecute allí los siguientes comandos y lea con atención todas las páginas de ayuda que se muestran para cada comando.

  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?

Respuesta2

Siguiendo tu ejemplo, tendrías que llamar:

Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item

Respuesta3

Enumere recursivamente todas las carpetas con el nombre "datos" y luego elimine su contenido.

$base_dir = 'D:\dir'
$name     = 'data'

Get-ChildItem $base_dir -Recurse -Force | Where-Object {
    $_.PSIsContainer -and
    $_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
    Remove-Item "$_\*" -Recurse -Force
}

En PowerShell v3 y versiones posteriores, puede reemplazar la condición del filtro $_.PSIsContainerusando el parámetro -Directorycon Get-ChildItem.

información relacionada