Pergunta

Nós podemos ver em um arquivos do diretório ordenadas por nome no Windows Explorer.

Se eu tentar a mesma coisa no Windows comandá-la ordens rápidas pelo nome de forma diferente - corretamente :

dir *.jpg /ON /B

cubierta.jpg
pag00.jpg
pag06.jpg
pag08.jpg
pag09.jpg
pag100.jpg
pag101.jpg
pag102.jpg
pag103.jpg
pag104.jpg
pag105.jpg
pag106.jpg
pag107.jpg
pag108.jpg
pag109.jpg
pag11.jpg, etc, etc, etc, ...

Existe uma maneira de obter dir a ordem por Nome onde se lê os números como um humano faria?

Foi útil?

Solução

Sua melhor opção (se possível) é adicionar o suficiente zeros à esquerda (duas, neste caso) para os seus números menores para que a espécie não sair como esperado.

Outras dicas

Windows Explorer usa uma função de classificação especial, StrCmpLogicalW , que não é usado pelo cmd.exe , portanto, as diferenças na saída. Você pode escrever seu próprio programa de triagem com ele, apesar de tudo.

Você pode também estar interessado em entradas de Michael Kaplan em este (de Raymond Chen de caixa de sugestões ).

He he he. Vocês todos querem saber a minha solução?

Eu estou usando um programa chamado ImageMagic que converte os meus arquivos PDF 200MB para JPG. No final do processo demorado ele serializa todos os arquivos em ordem numérica ... Então, basicamente, os arquivos data de criação aumentos no valor ligeiramente à medida que cada arquivo está sendo escrito para o disco rígido. Assim, qualquer um dos dois comandos do arquivo de lote seguintes irá gravar os arquivos em ordem 'correta':

dir *.jpg /ODN /B > files.txt

for /f "tokens=*" %%a in ('dir *.jpg /ODN /B') do (
    echo ^<page^>%%a^</page^> >>pages.xml.fragment
)

Assim, o dir * .jpg / OD ordens de comando do conteúdo diretório ascendente (criação?) Data, e podemos ignorar completamente o nome do arquivo real.

Actualmente não há built-in ferramentas de linha de comando que pode classificar naturalmente. Se você quiser, por favor voto para o recurso para fazer Microsoft mudar sua mente

Este, porém, pode ser simulado com uma substituição regex. No Windows, você pode usar JScript e VBS para fazer isso. Mas a maneira mais fácil é usando o PowerShell. Você pode chamá-lo de cmd.exe como este

powershell -Command "(Get-ChildItem | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) }).Name"

Claro que você vai precisar alterar o número na PadLeft(20) se seus arquivos contém uma série mais longa de dígitos

Como classificar pelo nome do arquivo da mesma forma que o Windows Explorer faz?

Uma solução lote nativa pode ser encontrado em Naturalmente classificar arquivos em lote se seus arquivos têm apenas um único número no final

@echo off
setlocal enabledelayedexpansion
for %%a in (*.txt) do (
    set num=00000000000000000000%%a
    set num=!num:~-20!
    set $!num!=%%a
)
for /f "tokens=1,* delims==" %%a in ('set $0') do echo %%b

4NT / TCC / TC de JPSoft uso ordem de classificação natural, por padrão; Alternativamente, se você tiver acesso a um "tipo" programa GNU, como o ferramentas Cygwin , você pode fazer algo como " ls -1 | / bin / tipo -g" ou "dir / b | \ cygwin \ bin \ tipo -g"; que lhe dará os nomes em ordem de classificação natural.

Se você está limitado a ferramentas que são nativas de Windows, você pode tentar o ferramentas do Windows Scripting e fazer algo como o uso de um FileSystemObject para obter os nomes e expressões regulares para extrair a parte numérica dos nomes de arquivo para usar como chaves em um objeto Dictionary. Vou deixar o real codificação como um exercício para o leitor:)

Não, não há nenhuma maneira de fazer isso. Windows Explorer usa uma abordagem diferente para lidar com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top