Archivo por lotes para eliminar archivos de la carpeta comodín

Archivo por lotes para eliminar archivos de la carpeta comodín

¿Cómo creo un archivo por lotes que elimina archivos de varios directorios?

D:\L1\asdasda\L3\*.txt
D:\L1\dfghfghfh\L3\*.txt
D:\L1\tyutyugj\L3\*.txt
D:\L1\ytrtyrty\L3\*.txt

Como:

D:
del "d:\L1\*\L3\*.txt"

Nota de barlop- el interrogador agrega-

Tengo alrededor de cien de esos directorios. No quiero borrar las Carpetas, sólo los archivos. Todos ellos tienen una carpeta L3 y todos contienen algunos archivos con la misma extensión. Esos son sólo archivos temporales, pero no se eliminan automáticamente.

Respuesta1

ARCHIVO POR LOTES PARA ELIMINAR DE SUBCARPETAS CON DIFERENTES NOMBRES DINÁMICAMENTE USANDO COMODÍN PARA LOS NOMBRES DE SUBCARPETAS

Archivo por lotes para eliminar archivos de la carpeta comodín

Aquí hay un ejemplo de secuencia de comandos por lotes fácil y simple que uso para completar este tipo de tarea todo el tiempo. Conecté las rutas de carpetas variables para satisfacer sus necesidades como usted describe:

MUESTRA DE GUIÓN DE LOTE

(Configure su carpeta raíz variable y su subcarpeta en la parte superior, y los bucles FOR /D y FORse iteran en consecuencia para hacer el resto de la magia atravesando el directorio según la lógica especifica y completa el DEL /Q /Fcomando para los *.txtarchivos)

@ECHO ON

SET SourceDir=D:\L1
SET SourceSubDir=L3

:: --// note the asterisk wildcard after SourceDir in the first FOR /D loop using X as the variable
:: --// note the X variable appended to the beginning of the second FOR (no /D switch here) loop in the SET part using Y as the variable
FOR /D %%X IN ("%SourceDir%\*") DO FOR %%Y IN ("%%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%%~Y"
GOTO EOF

NOTA: Si planea ejecutar esto copiando y pegando manualmente en el símbolo del sistema, entonces las variables en el FOR a los bucles se les debe eliminar uno de los signos de porcentaje en todas las partes, así que use lo siguiente para esa parte si está ejecutando esto manualmente con copiar y pegar en lugar de en un script por lotes y ejecutar así, así es como funcionará el ejemplo anterior.

FOR /D %X IN ("%SourceDir%\*") DO FOR %Y IN ("%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%~Y"

MÁS DETALLES E INVESTIGACIÓN

(Escribir FOR /? en el símbolo del sistema de Windows para ver este detalle)

PARA (sin interruptor)

Runs a specified command for each file in a set of files.

FOR %variable IN (set) DO command [command-parameters]

  %variable  Specifies a single letter replaceable parameter.
  (set)      Specifies a set of one or more files.  Wildcards may be used.
  command    Specifies the command to carry out for each file.
  command-parameters
             Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %%variable instead
of %variable.  Variable names are case sensitive, so %i is different
from %I.

If Command Extensions are enabled, the following additional
forms of the FOR command are supported:

PARA /D

FOR /D %variable IN (set) DO command [command-parameters]

    If set contains wildcards, then specifies to match against directory
    names instead of file names.

Respuesta2

Interpretando su línea \L1\*\L3\*. Como: Para un directorio L1 determinado, busque todos los subdirectorios que tengan un subdirectorio L3 y elimine todos los archivos que contiene.

Se debe escribir un script para recorrer la estructura del directorio. No es fácil de realizar como un archivo por lotes; es posible que deba usar Perl o PowerShell, que tienen formas de obtener una lista de directorios o archivos y luego realizar una acción repetida sobre ellos.

En pseudocódigo

Get list directories
For each dir 
  Cd into it
  Check if The dir L3 exists
  If it does then del .\L3\*.* 
  Go back up a level
Next dir

Pensaré en esto y lo hice en código de archivo por lotes, aunque estoy pensando en rehacerlo en PowerShell solo para ver la diferencia.

Ok lo pensé

Este archivo por lotes recorrerá la estructura de directorios desde donde se ejecuta y eliminará el contenido de cualquier directorio que tenga el nombre "L3".

@echo off
for /r %%d in (*) do call :process "%%d"
goto :eof

:process
pushd "%~dp1"
for /f "delims=" %%A in ('cd') do (
     set foldername=%%~nxA
    )
if "%foldername%"=="L3" del/q *.*
popd
goto :eof

Es posible que sea más simple, pero la acción de obtener solo el nombre del directorio actual es complicada (el bucle for en la sección de proceso)

Si un directorio comienza así

└───L1
    │   1.dat
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    │           c.dat
    │           d.dat
    ├───Bob
    │       6.dat
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    │           a.dat
    │           b.dat
    └───Ted
            6.dat

ejecutar cleantree debería verse así

└───L1
    │   1.dat
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    ├───Bob
    │       6.dat
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    └───Ted
            6.dat

Respuesta3

for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt

for /fejecuta el siguiente comando do en todos los archivos del conjunto

%G in ('dir /ad /b D:\L1\')variable establecida como formato básico para cada carpeta dentro del directorio dado

eliminar comando usando establecer valor %G y comodín para el directorio


Ejecución de prueba primero

ejecute con echo para imprimir en la consola los comandos que se ejecutarán para probar el comando sin ejecutarlo realmente:

for /f %G in ('dir /ad /b D:\L1\') do echo del D:\L1\%G\L3\*.txt

información relacionada