Estou usando o Windows 10.
Eu tenho muitas pastas com o mesmo nome (suponha o nome "data") em diferentes subdiretórios de um diretório base (aqui "d:\dir").
Como posso excluir o conteúdo (contendo apenas arquivos) de todas as pastas chamadas "dados" sem excluí-las?
Por exemplo, para três pastas:
d:\diretório\dados d:\dir\tmp1\dados d:\dir\tmp3\tmp2\dados
Responder1
De dentro de uma janela de prompt de comando do Windows, a seguinte linha de comando pode ser usada para excluir apenas todos os arquivos (não pastas) em todos os data
diretórios D:\dir
e seus subdiretórios:
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\*"
A mesma linha de comando seria escrita da seguinte forma em um arquivo em lote do 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\*"
O comandoPARAé executado em um processo de comando separado iniciado %ComSpec% /C
em segundo plano pela linha de comando:
dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"
A variável de ambiente ComSpec
é geralmente definida como %SystemRoot%\System32\cmd.exe
pode ser vista olhando nosistemavariáveis de ambiente no WindowsPainel de controle - Sistema - Configurações avançadas do sistema - Variáveis de ambiente.... A variável de ambiente SystemRoot
é definida por padrão com o caminho para o diretório do Windows. Em outras palavrasPARAé executado por padrão na maioria dos PCs Windows C:\Windows\System32.exe
com a opção /C
e a linha de comando especificada entre ('
e ')
. Veja também o artigo da Wikipedia com uma lista de predefinidosVariáveis de ambiente do Windows.
O comandoDIRsaídas para lidarSTDOUT(saída padrão)
- em formato simples por causa da opção
/B
- apenas nomes de diretórios por causa da opção
/AD
(diretório de atributos) - com caminho completo por causa da opção
/S
- correspondendo ao padrão curinga
*data
- no diretório especificado
D:\dir
- e todos os seus subdiretórios também por causa da opção
/S
.
DIRgeraria uma mensagem de erro para lidarSTDERR(erro padrão) em nenhuma entrada de diretório que corresponda a esses critérios. Esta mensagem de erro é suprimida redirecionando-a para o dispositivoNULcom 2>nul
.
Então a saída deDIRé um exemplo dado:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
A saída deDIRlidarSTDOUTé redirecionado com |
para lidarSTDIN(entrada padrão) do próximo comandoENCONTRAR.
ENCONTRARpesquisas em fluxo lido deSTDINlinha por linha
- não diferencia maiúsculas de minúsculas por causa da opção
/I
- a string interpretada literalmente
\data
- que deve ser encontrado no final de uma linha por causa da opção
/E
.
EntãoENCONTRARsaídas para lidarSTDOUTdo comando background processa todas as linhas com \data
o final da linha, que é novamente para o exemplo dado:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
Filtrando a saída do comandoDIRcomENCONTRARé necessário excluir um diretório com um nome semelhante ao MyData
que também é gerado porDIRpor causa do curinga *
que é necessário para obter não a saída de todos os subdiretórios D:\dir\data
e seus subdiretórios, mas data
de todos os diretórios D:\dir
e seus subdiretórios.
Leia o artigo da Microsoft sobreUsando operadores de redirecionamento de comandopara uma explicação de 2>nul
e |
. Os operadores de redirecionamento >
e |
devem ter escape com caractere circunflexo ^
emPARAlinha de comando a ser interpretada como caracteres literais quando o interpretador de comandos do Windows processa esta linha de comando antes de executar o comandoPARAque executa a dir
linha de comando incorporada em um processo de comando separado iniciado em segundo plano.
PARAcom a opção /F
captura toda a saída finalmente para lidarSTDOUTdo processo de comando iniciado e processa essa saída linha por linha após o término do iniciado cmd.exe
.
Linhas vazias são sempre ignoradas porPARA, mas não há linhas vazias geradas porDIReENCONTRAR.
PARAignora por padrão também todas as linhas que começam com a, ;
que é o caractere de fim de linha padrão. Mas todas as linhas capturadas porPARAneste caso, nunca comece com ponto e vírgula porque todas as linhas começam com D:
. Portanto, o padrão eol=;
pode ser mantido. Caso contrário, eol=|
geralmente é o melhor no processamento de uma lista de nomes de arquivos/pastas, pois nenhum nome de arquivo/pasta pode conter a barra vertical.
PARAdividiria por padrão cada linha em substrings usando espaço normal e caractere de tabulação horizontal como delimitadores de string e atribuiria apenas a primeira string separada por espaço/tabulação à variável de loop especificada I
. O nome de uma pasta no caminho de um data
diretório pode conter um caractere de espaço. Por esse motivo, uma lista vazia de delimitadores é especificada com delims=
a qual desativa o comportamento de divisão de linha, resultando na atribuição à variável de loop I
sempre do nome completo e qualificado de uma data
pasta encontrada.
PARAexecuta para cada data
diretório atribuído ao I
comando:
del /A /F /Q "%I\*"
%I
é substituído antes da execução deDELpelo nome completo do diretório qualificado atribuído atualmente à variável de loop I
.
O comandoDELé para excluir arquivos. Não exclui diretórios. A opção /A
é usada para excluir todos os arquivos independentes de seus atributos, incluindo arquivos com conjunto de atributos ocultos queDELnão excluiria sem opção /A
. A opção /F
é necessária para forçar também a exclusão de um arquivo com conjunto de atributos somente leitura que não seria excluído sem a opção /F
. A opção /Q
é usada para suprimir a consulta perguntando ao usuário se realmente todos os arquivos correspondentes *
devem ser excluídos porDEL.
O nome completo do diretório qualificado deve ser colocado entre aspas duplas porque pode conter um espaço ou um desses caracteres &()[]{}^=;!'+,`~
que requer o uso de "
uma sequência de argumentos de um comando, conforme explicado na ajuda deDMC na última página de ajuda que é exibida na execução em uma janela de prompt de comando cmd /?
.
Por favor, note queDELnão é possível excluir arquivos nos quais o usuário não tem permissão NTFS para excluir arquivos ou que estão atualmente abertos por um aplicativo de uma maneira que impede a exclusão do arquivo enquanto é aberto pelo aplicativo.DELgera uma mensagem de erro para cada arquivo que não pode ser excluído devido à falta de NTFS ou permissões de acesso a arquivos.
Para entender os comandos usados e como eles funcionam, abra uma janela de prompt de comando, execute os seguintes comandos e leia com atenção todas as páginas de ajuda exibidas para cada comando.
del /?
dir /?
echo /?
findstr /?
for /?
Responder2
Seguindo seu exemplo, você teria que ligar:
Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item
Responder3
Enumere recursivamente todas as pastas com o nome "dados" e exclua seu conteúdo.
$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
}
No PowerShell v3 e mais recente, você pode substituir a condição do filtro $_.PSIsContainer
usando o parâmetro -Directory
por Get-ChildItem
.