Minha solução foi executar del *.xyz~
antes do meu copy *.xyz
. Não é brilhante, mas funciona.
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~
?
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:
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.
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.
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
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~
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
Apenas para completar: PowerShell:
Copy-Item *.txt foo
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.
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.)
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:
Verifique se o bit de arquivamento está definido para todos os arquivos .txt
:
ATTRIB +A *.txt
Remova o bit de arquivo de todos os arquivos .txt~
:
ATTRIB +A *.txt~
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.
você pode tentar: copie "* .txt"