![Arquivo em lote para excluir arquivos da pasta curinga](https://rvso.com/image/1476429/Arquivo%20em%20lote%20para%20excluir%20arquivos%20da%20pasta%20curinga.png)
Como crio um arquivo em lote que exclui arquivos de vários diretórios?
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- o questionador acrescenta-
Tenho cerca de cem desses diretórios. Não quero deletar as pastas, apenas os arquivos. Todos eles possuem uma pasta L3 e todos contêm alguns arquivos com a mesma extensão. Esses são apenas arquivos temporários, mas não são excluídos automaticamente.
Responder1
ARQUIVO EM LOTE PARA EXCLUIR DE SUBPASTAS COM NOMES DIFERENTES DINAMICAMENTE USANDO CURINGA PARA NOMES DE SUBPASTAS
Arquivo em lote para excluir arquivos da pasta curinga
Aqui está um exemplo de script em lote fácil e simples que uso para concluir esse tipo de tarefa o tempo todo. Conectei os caminhos de pasta variáveis para atender às suas necessidades conforme você descreve:
EXEMPLO DE SCRIPT DE LOTE
(Defina sua pasta raiz variável e subpasta no topo, e os FOR /D
loops FOR
e iteram de acordo para fazer o resto da mágica percorrendo o diretório conforme a lógica especifica e completa o DEL /Q /F
comando para os *.txt
arquivos)
@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
OBSERVAÇÃO: Se você planeja executar isso copiando e colando manualmente no prompt de comando, as variáveis no FOR
os loops precisam ter um dos sinais de porcentagem removidos em todas as partes, então use o abaixo para essa parte se você estiver executando manualmente com copiar e colar, em vez de em um script em lote e executando assim que o exemplo acima funcionará.
FOR /D %X IN ("%SourceDir%\*") DO FOR %Y IN ("%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%~Y"
MAIS DETALHES E PESQUISAS
(Digitar FOR /?
no prompt de comando do Windows para ver este detalhe)
PARA (sem 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.
Responder2
Interpretando sua linha \L1\*\L3\*. Como: Para um determinado diretório L1, encontre todos os subdiretórios que possuem um subdiretório L3 e exclua todos os arquivos nele.
Um script deve ser escrito para percorrer a estrutura de diretórios. Não é fácil executá-lo como um arquivo em lote, talvez seja necessário usar Perl ou PowerShell, que possuem maneiras de obter uma lista de diretórios ou arquivos e, em seguida, executar uma ação repetida sobre eles.
Em 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
Vou pensar sobre isso e fiz isso em código de arquivo em lote, embora esteja pensando em refazê-lo no PowerShell só para ver a diferença.
Ok, pensei sobre isso
Este arquivo em lote percorrerá a estrutura de diretórios de onde é executado e excluirá o conteúdo de qualquer diretório que tenha o nome "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
Pode ser possível torná-lo mais simples, mas a ação de obter apenas o nome do diretório atual é confusa (o loop for na seção do processo)
Se um diretório começar assim
└───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
execute cleantree deve ficar assim
└───L1
│ 1.dat
│
├───Alice
│ │ 9.dat
│ │
│ └───L3
├───Bob
│ 6.dat
│
├───Carole
│ │ 2.dat
│ │
│ └───L3
└───Ted
6.dat
Responder3
for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt
for /f
executa o seguinte comando do em todos os arquivos no conjunto
%G in ('dir /ad /b D:\L1\')
variável definida como o formato básico para cada pasta dentro de um determinado diretório
comando delete usando definir valor% G e curinga para o diretório
Teste primeiro
execute com echo para imprimir no console os comandos que serão executados para testar o comando sem realmente executá-lo:
for /f %G in ('dir /ad /b D:\L1\') do echo del D:\L1\%G\L3\*.txt