Como posso obter os comandos “dir” e “copy” para operar em “* .xyz”, mas não em “* .xyz ~”?

4

Quando uso copy *.txt somefolder\ , o sistema também parece copiar todos os arquivos *.txt~ , o que não é o que eu quero. Um mesmo efeito semelhante pode ser visto com dir :

C:\Users\Paul\Documents\Programs\Proffy>dir *.txt
 Volume in drive C is Vista
 Volume Serial Number is EC23-AD6B

 Directory of C:\Users\Paul\Documents\Programs\Proffy

29/11/2008  13:54            35,821 COPYING.txt
31/10/2009  21:54             1,644 INSTRUCTIONS.txt
06/06/2009  15:57             1,393 INSTRUCTIONS.txt~
04/01/2009  11:59               116 Notes.txt
19/04/2009  16:53               134 README.txt
04/01/2009  12:42               132 README.txt~
31/10/2009  21:30               197 TODO.txt
31/10/2009  19:10               414 TODO.txt~
               8 File(s)         39,851 bytes
               0 Dir(s)  41,938,862,080 bytes free

C:\Users\Paul\Documents\Programs\Proffy>

Como posso fazer com que dir e copy operem somente em arquivos que terminam com .txt e não .txt~ ?

    
por pauldoo 31.10.2009 / 23:01

6 respostas

1

Minha solução foi executar del *.xyz~ antes do meu copy *.xyz . Não é brilhante, mas funciona.

    
por 01.11.2009 / 16:40
5

Aparentemente, o shell considera tanto o como como o nome longo da expansão de caractere curinga. Uma explicação mais longa pode ser encontrada em resposta do shf301 . Isso é lamentável e provavelmente uma sobra de Ye Olde Days do DOS, porque é com isso que cmd está tentando ser compatível - afinal de contas.

Várias opções aqui:

  1. Use forfiles , que tem uma semântica diferente para expansão de curinga:

    forfiles /m *.txt /c "cmd /c copy @file foo"
    

    Isso está disponível pelo menos no Vista e mais tarde.

  2. Use for e verifique a extensão:

    for %a in (*.txt) do @if %~xa==.txt @copy "%i" foo
    

    Infelizmente, for também retorna todos os arquivos com a extensão .txt~ ao usar apenas a expansão com curinga. É por isso que precisamos verificar a extensão uma segunda vez.

  3. Use xcopy . Embora xcopy tenha a mesma semântica para expansão de curingas que o shell, você pode fornecer um arquivo com nomes a serem ignorados:

    echo .txt~>tmpfile
    xcopy *.txt foo /exclude:tmpfile
    del tmpfile
    
  4. Use robocopy . Embora robocopy tenha a mesma semântica para expansão de curingas que o shell, você pode fornecer uma lista de arquivos / curingas a serem ignorados:

    robocopy . foo *.txt /XF *.txt~
    
  5. Use for , dir e findstr em uma combinação apropriada. Isso essencialmente apenas filtra todas as linhas que têm ~ no final e opera com o resto. A variante if acima foi mais elegante, eu acho.

    for /f "usebackq delims=" %i in ('dir /b *.txt ^| findstr /r "[^~]$"') do @copy "%i" foo
    
  6. Apenas para completar: PowerShell:

    Copy-Item *.txt foo
    
por 01.11.2009 / 02:02
1

Não tenho certeza de como parar o dir / copy de corresponder apenas a * .txt, mas posso explicar por que o * .txt retorna o que ele faz; ele corresponde ao nome de arquivo curto que termina com .txt para todos os arquivos, faça um dir / x * .txt para ver isso. Esse problema ocorre para cada conjunto de extensões que começam com os mesmos três primeiros caracteres (por exemplo, * .htm corresponderá a htm, html e até mesmo htmlasdfasdf).

Além disso, quase todos os aplicativos do Windows agem dessa forma porque a API que o sistema operacional fornece para pesquisar arquivos FindFirstFile corresponde aos nomes de arquivos longos e nomes de arquivos curtos. Para citar:

The search includes the long and short file names.

Você terá que fazer algum tipo de filtragem personalizada, como sugerido por Johannes Rössel.

    
por 01.11.2009 / 02:24
0

Como Joey mencionou a integridade, observo, como mencionado aqui , que isso varia de acordo com os comandos DIR e COPY do interpretador de comandos que alguém usa. O comando DIR no Take Command e seu comando COPY , por exemplo, correspondem apenas a nomes longos por padrão e, portanto, não exibem esse comportamento. ( A correspondência de nomes curtos e longos pode ser ativada para compatibilidade com os comandos DIR e COPY do CMD.)

    
por 22.02.2011 / 18:31
0

Os arquivos de cópia de cobertura de resposta existentes apenas caíram, mas não os listaram.

Você pode usar o arquivo para os dois propósitos. Embora seja destinado a ser usado com XCOPY 1 , ele também funciona com DIR 2 .

Etapas:

  1. Verifique se o bit de arquivamento está definido para todos os arquivos .txt :

    ATTRIB +A *.txt
    
  2. Remova o bit de arquivo de todos os arquivos .txt~ :

    ATTRIB +A *.txt~
    
  3. Listar todos os arquivos .txt que têm seu conjunto de bits de arquivo:

    DIR /AA *.txt
    

    ou copie-os para somefolder :

    XCOPY /A *.txt somefolder/
    

1 O XCOPY usa a opção /A para excluir todos os arquivos que não têm seu conjunto de bits de arquivo. Isso pode ser usado para excluir determinados arquivos (por exemplo, arquivos temporários) dos backups diários. Com a opção /M , também remove o bit de arquivamento dos arquivos, o que é útil ao copiar arquivos para pequenos dispositivos de armazenamento (por exemplo, disquetes). Além disso, a modificação de arquivos define automaticamente o bit de arquivamento, portanto, a opção /M pode ser usada para backups incrementais.

2 DIR /AA mostra apenas arquivos que têm seu conjunto de atributos de arquivo.

    
por 14.12.2012 / 16:34
-1

você pode tentar: copie "* .txt"

    
por 31.10.2009 / 23:59