Windows equivalente ao comando UNIX 'rmdir *'

0

Em um sistema * NIX, você pode digitar facilmente rmdir * para remover todos os diretórios vazios em . . O rmdir irá reclamar sobre diretórios não vazios e não apagá-los.

Basicamente, se você tem uma árvore como esta:

/
  d0/
    file
  d1/
    d0/
  d2/
  d3/

Em seguida, a execução de rmdir * de / resultará na exclusão de d2/ e d3/ . d0/ e d1/ serão deixados sozinhos com um erro ecoado sobre eles não serem vazios, para evitar que o conteúdo seja perdido no limbo.

/
  d0/
    file
  d1/
    d0/

Não consegui encontrar um equivalente do Windows para isso. O mais parecido é rmdir /s . , que é equivalente a rm -r . , exceto que ele se recusa a excluir . porque o shell está usando. Não tenho certeza se rm -r . também se recusa a excluir . . Não testou isso.

Como * NIX rmdir , o Windows rmdir se recusará a excluir um único diretório se não estiver vazio. No entanto, não parece haver um seletor de curinga como o típico * , o que é estranho porque esse token pode ser usado em qualquer outro lugar.

É esse tipo de coisa que me frustra com a linha de comando do Windows. Se eu tiver 4.000 diretórios, rmdir ing de cada diretório explicitamente obviamente não é uma opção sã. Deve haver uma maneira melhor.

Eu tentei criar uma instrução for de acordo com a sintaxe na ajuda de uso ( for /? )

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

... para obter ...

for %f in * do rmdir %f

e várias variações disso (como mudar o segundo %f para %f% , encapsulando a sintaxe mesmo sabendo que é insensível a maiúsculas e minúsculas, cercando * com parens, et al). Nenhum dos quais funcionou. Tudo falhando com erros inexplicáveis e inúteis, como:

%f was unexpected at this time.
* was unexpected at this time.

(NB: estou tentando isso no prompt interativo, não em um script)

Ou no caso da (*) variação ...

>for %f in (*) do rmdir %f
>rmdir file
The directory name is invalid.
>dir
 Volume in blah blah blah

 Directory of blah

 blah blah    <DIR>          .
 blah blah    <DIR>          ..
 blah blah    <DIR>          nonemptydir
 blah blah    <DIR>          emptydir
 blah blah                 1 file
     1 File(s)             1 bytes
     4 Dir(s)    huge number bytes free

... nem sequer toca nos diretórios.

Eu não entendo por que isso faria isso. Eu segui a sintaxe como ela foi descrita na ajuda.

O Powershell não é uma opção. Eu preciso ser capaz de fazer isso em um shell que é garantido para ser instalado, ou seja, cmd.exe . Jeff Zeitlin me informou que o Powershell é garantido > = Windows 7 . No entanto, cmd.exe ainda é o preferido.

    
por Braden Best 11.07.2017 / 19:38

2 respostas

2

Sua declaração FOR quer a opção /D : FOR /D %I in (*) do ... . Isso faz com que os arquivos sejam ignorados inteiramente e apenas pastas (diretórios) sejam processadas. Como RMDIR/RD não remove um diretório não vazio, isso parece ser o que você deseja; observe que versões diferentes do Windows podem reagir de maneira diferente ao erro de tentar remover um diretório não vazio.

Referências: SS64 em FOR e FOR /D (FOR for Folders)

    
por 11.07.2017 / 20:10
2

%f foi inesperado neste momento. * foi inesperado no momento.

for %f in * do rmdir %f

Quando usado dentro de um arquivo de lote, você precisa dobrar o % s.

O set ao qual você se refere é uma expressão entre parênteses. Os parênteses não são não opcionais.

Linha de comando corrigida:

for %f in (*) do rmdir %f

Arquivo em lote correto:

for %%f in (*) do rmdir %%f

Isso está documentado na ajuda on-line:

> for /?
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.

E em para :

If you are using the FOR command at the command line rather than in a batch program, use just one percent sign: %G instead of %%G.

FOR Parameters

The first parameter has to be defined using a single character, for example the letter G.

FOR %%G IN ...
por 11.07.2017 / 19:49