Exclusões de diretório curinga com robocopy - caso estranho

16

Preciso obter o robocopy para excluir qualquer arquivo cujo caminho contenha um diretório com um nome específico. Por exemplo, "bar":

c:\foo\bar\a.txt
c:\bar\c.txt
d:\baz\bar\flub\d.txt

deve ser excluído, mas não

c:\foo\barf\b.txt

Aqui estão as coisas que tentei - cada uma das quais foi rejeitada por robocopy:

/XD \bar\
/XD *\bar\*
/XD *^\bar^\*

Alguma ideia?

Jesse
fonte

Respostas:

18

Acontece que as combinações / XD no nome do diretório - não no caminho completo. Portanto, você não precisa se preocupar em combinar as barras invertidas.

Portanto, para excluir diretórios (em qualquer lugar do caminho) chamados "bar", uma barra simples / XD funcionará. Se você deseja excluir "barf" também, você pode usar / XD bar *.

Às vezes a resposta é mais simples do que você pensa.

Jesse
fonte
4

Parte da falha está usando um \ no Robocopy à direita quando se refere a um diretório - que é um não-não - porque o Robocopy tenta interpretá-lo como um caractere de escape. Quase todo mundo comete esse erro de uma maneira ou de outra com o Robocopy. Com isso em mente, este exemplo funcionará:

/XD "\Bar"

Se você deseja combinar uma estrutura de pastas mais específica (para não corresponder a outras subpastas, você pode adicionar mais detalhes, como:

/XD "\Foo\Bar"
/XD "C:\Foo\Bar"
Micheal Espinola
fonte
2
Exclusões curinga não funcionam. Robocopy lançará um erro se você tentar. Você testou seus exemplos?
User1751825 de
Usei e usei, exceto pelo fato de adicionar erroneamente um asterisco ao meu exemplo, para o qual acho que estou confundindo sintaxe com a opção / XF. Eu corrigi minha resposta. Obrigado.
Micheal Espinola
1

Se você estiver tentando filtros de diretório diferentes, limpe sua pasta de destino entre as alterações!

Um problema para mim foi que eu não percebi que a opção de ignorar diretório também é aplicada às pastas de destino. Eu executei o robocopy /MIRe alterei o diretório de origem, e meu diretório de destino foi atualizado conforme o esperado. Então notei que tinha pastas de arquivo que eu não queria, então adicionei /XD archive, mas minha pasta de destino ainda tinha pastas de arquivo!

Depois de mexer com curingas e incluir / excluir os \, finalmente tentei excluir a pasta de destino e executar novamente o script - desta vez, não havia as pastas de arquivo morto! Aqui está o comando que eu estava executando, com os nomes de diretório alterados para proteger os inocentes:

robocopy \\SERVER\Some\Folder\Path .\Some\Relative\Path /Copy:DAT /Mir /R:0 /W:1 /XD archive*
tehDorf
fonte
0

Sinto muito, mas de acordo com a documentação em https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy :

/ xf <FileName> [...] Exclui arquivos que correspondem aos nomes ou caminhos especificados. Observe que FileName pode incluir caracteres curinga (* e?).
/ xd <Diretório> [...] Exclui diretórios que correspondem aos nomes e caminhos especificados.

Portanto, isso significa especificamente que o curinga pode ser usado no sinalizador / xf, mas não no sinalizador / xd.

Pedro
fonte