Exclua o conteúdo de pastas com o mesmo nome em subdiretórios diferentes

Exclua o conteúdo de pastas com o mesmo nome em subdiretórios diferentes

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 datadiretórios D:\dire 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% /Cem 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.exepode 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.execom a opção /Ce 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 especificadoD:\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 \datao 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 MyDataque também é gerado porDIRpor causa do curinga *que é necessário para obter não a saída de todos os subdiretórios D:\dir\datae seus subdiretórios, mas datade todos os diretórios D:\dire seus subdiretórios.

Leia o artigo da Microsoft sobreUsando operadores de redirecionamento de comandopara uma explicação de 2>nule |. 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 dirlinha de comando incorporada em um processo de comando separado iniciado em segundo plano.

PARAcom a opção /Fcaptura 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 datadiretó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 Isempre do nome completo e qualificado de uma datapasta encontrada.

PARAexecuta para cada datadiretório atribuído ao Icomando:

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 $_.PSIsContainerusando o parâmetro -Directorypor Get-ChildItem.

informação relacionada