Curingas do Windows com arquivos com mais de 3 caracteres

6

No Windows 7, tenho um diretório contendo os quatro arquivos a seguir:

  • xxx.txt
  • xxx.txt2
  • xxx2.txt
  • xxx2.txt2

Com o arquivo com mais de três caracteres como extensão de arquivo, o comportamento do curinga * parece estranho:

dir *.txt

10/13/2014  04:14 PM                 6 xxx.txt
10/13/2014  04:17 PM                 6 xxx2.txt
10/13/2014  04:17 PM                 6 xxx2.txt2
10/13/2014  04:14 PM                 6 xxx.txt2
           4 File(s)             24 bytes
           0 Dir(s)   6,660,980,736 bytes free

Eu esperaria ver apenas os dois arquivos com extensão txt e não aqueles com txt2 (como seria em uma máquina Linux). O MS-DOS ignora o truncar a extensão do arquivo para 3 caracteres ou adiciona automaticamente outro caractere curinga no final? Se eu quiser excluir apenas os arquivos com extensão txt e não aquele com txt2, qual comando devo usar? Obrigado

    
por tristof 13.10.2014 / 16:22

3 respostas

6

Você não está usando o MS-DOS; não permitia nem mesmo extensões de arquivo com mais de 3 caracteres. Você está usando a linha de comando do Windows - o cmd.exe shell, especificamente.

Mas o Windows realmente se esforça para permanecer compatível com os programas daquela época. Então, até o Windows 8 (ou algo parecido), todos os arquivos com extensões mais longas têm um alias que tem a extensão truncada, junto com o próprio nome.

Se você executar dir /x , provavelmente verá que cada arquivo tem um "nome abreviado" atribuído a ele, que é limitado a 8 + 3 caracteres, assim como no MS-DOS e 16 bits Windows.

Esses nomes estão lá, caso o usuário queira, digamos, atualizar para o Windows 95 e ainda acessar seus arquivos através de programas originalmente escritos para o Windows 3.1 - assim, rodar um programa de 16 bits não trava, mas apenas mostra C:\PROGRA~1 e C:\MYDOCU~1\CALENDAR.TXT no lugar de C:\Program Files e C:\My Documents\Calendar.txt .

(E sim, algumas pessoas realmente usaram software antigo de 16 bits mesmo no Windows XP / Vista dias ... Eu tenho certeza que o Windows 8 desativa os "nomes curtos" por padrão, no entanto. @EBGreen não está vendo o mesmo 'problema' ...)

Outra coisa a considerar é que o shell antigo do Windows, cmd.exe , desenvolveu algumas peculiaridades e correções de compatibilidade em si. Por exemplo, devido à maneira como o MS-DOS correspondia aos nomes de arquivos, dir .txt significava o mesmo que dir *.txt , mesmo que não fosse intencional. Mas as pessoas se acostumaram com a sintaxe mais curta, e mesmo que o sistema operacional Windows não trate mais .txt como curinga, cmd.exe Ainda aceita essa sintaxe . (O comando dir não é um programa por si só, mas embutido no shell.)

(Da mesma forma, no artigo vinculado, outra peculiaridade de curinga é descrita - nomes de arquivos do Windows podem ter extensão no , mas as pessoas estão realmente acostumadas a digitar *.* , portanto significa a mesma coisa como * e o ponto solitário é ignorado.)

    
por 13.10.2014 / 16:45
3

Eu não posso dizer por que isso funciona dessa maneira. É muito estranho. O que posso dizer é que o Powershell (que você deve ter na máquina) funciona da maneira esperada. No powershell:

PS I:\temp\test> ls


    Directory: I:\temp\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        10/13/2014   9:29 AM          3 bar.txt
-a---        10/13/2014   9:29 AM          3 bar.txt2
-a---        10/13/2014   9:29 AM          3 foo.txt
-a---        10/13/2014   9:29 AM          3 foo.txt2

PS I:\temp\test> ls *.txt


    Directory: I:\temp\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        10/13/2014   9:29 AM          3 bar.txt
-a---        10/13/2014   9:29 AM          3 foo.txt
    
por 13.10.2014 / 16:32
2

O grawity identificou corretamente que o comportamento vem de nomes de arquivos curtos. As máscaras de arquivo são comparadas aos nomes longos e curtos.

As regras completas sobre como os curingas são comparados com os nomes de arquivos estão disponíveis na seção "sourceMask" de Como o comando Windows RENAME interpreta curingas?

Você pode obter o resultado desejado do DIR por meio de canalização para FINDSTR:

dir *.txt* | findstr /vrix "[0-9].*\.txt[^.][^.]*"
    
por 14.10.2014 / 20:01