AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1695517
Accepted
Dongliu
Dongliu
Asked: 2021-12-24 00:45:07 +0800 CST2021-12-24 00:45:07 +0800 CST 2021-12-24 00:45:07 +0800 CST

O comando de cópia do Windows concatena vários arquivos em ordem não numérica

  • 772

Eu tenho uma pasta com cerca de 5000 .tsarquivos que quero concatenar em um. Eles seguem o formato de nomenclatura de chunk_nso por exemplo chunk_50, chunk_51, chunk_52etc. Quando eu executo o comando de cópia do windows assim:

copy /b *.ts final.ts

Ele não itera por eles em ordem numérica normal. Ele começará a concatená-los nesta ordem:

chunk_100, chunk_1000, chunk_1001, chunk_1002, chunk_1003, chunk_1004, chunk_1005, chunk_1006, chunk_1007, chunk_1008, chunk_1009,chunk_101

e assim por diante.

Parece que ele não olha para o nome do arquivo inteiro quando itera sobre eles. Mesmo se eu remover o de chunk_antemão e apenas nomeá-los de 1 a 5000, o problema ainda persistirá. Este é um comportamento pretendido? E existe uma maneira melhor para eu concatenar todos esses arquivos?

windows-10 windows-terminal
  • 5 5 respostas
  • 1249 Views

5 respostas

  • Voted
  1. Best Answer
    user1686
    2021-12-24T01:07:15+08:002021-12-24T01:07:15+08:00

    Na maioria dos programas, a ordem numérica nunca foi a ordem normal. Apenas recentemente os gerenciadores de arquivos (como o Windows Explorer) começaram a classificar arquivos usando "classificação natural", mas o copycomando e o *não foram alterados de acordo.

    Em vez disso, a expansão classifica os nomes dos arquivos por sua ordem de bytes* ASCII , comparando cada caractere separadamente. Por exemplo, com "chunk_1000.ts" vs "chunk_101.ts" (a extensão faz parte do nome), os primeiros 8 bytes ( ) são iguais, e então você tem  <  (zero é ASCII 48, um é ASCII 49) e, portanto,  <  – mesmo que mais dígitos sigam, eles não são considerados parte de um "número" inteiro.chunk_1001chunk_100(0.ts)chunk_101(.ts)

    (A ordem de bytes é a maneira mais direta de classificar nomes - tudo o que é necessário é comparar diretamente dois locais de memória. Essa simplicidade era importante quando a RAM era medida em kilobytes. Agora tem sido o caso por uns bons 50 anos, então é praticamente impossível para mudar agora, devido a muitos scripts que dependem do comportamento existente.)

    A solução mais simples é preencher todos os números com uma largura fixa, por exemplo chunk0050 chunk0100.

    Uma solução alternativa diferente, disponível em shells mais avançados, como PowerShell ou Bash, é obter e classificar a lista de entradas como uma etapa separada. Por exemplo, no Linux, você usaria os comandos externos 'sort' ou 'natsort' para obter a ordem desejada (eles não são exatamente parte do Bash, mas geralmente estão presentes onde quer que o Bash esteja presente):

    (printf '%s\n' chunk*.ts | sort -V | xargs -d'\n' cat) > allchunks.ts
    

    No PowerShell, Sort-Objectpode ser dado um comparador personalizado; não há um pré-definido para a ordem "natural" (numérica), mas a partir daqui você pode emprestar uma linha:

    $ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }
    $filenames = Get-ChildItem chunk*.ts | Sort-Object $ToNatural
    $filenames = $filenames -join "+"
    cmd /c "copy $filenames allchunks.ts"
    
    • 24
  2. Gilles 'SO- stop being evil'
    2021-12-24T15:16:43+08:002021-12-24T15:16:43+08:00

    Os nomes dos arquivos são nomes , não números, então eles são comparados como strings de texto, usando a ordem lexicográfica. chunk_1vem antes chunk_10que vem antes chunk_10aque vem antes chunk_1zque vem antes chunk_2.

    Se zsh estiver disponível, você pode usar o seguinte comando:

    <*.ts(n) >final.ts
    

    Isso aproveita uma combinação de recursos do zsh:

    • Redirecionamentos sem comando copiam a entrada para a entrada.
    • Com vários redirecionamentos de entrada , as entradas são concatenadas.
    • Os parênteses após o padrão curinga contêm qualificadores glob que controlam quais arquivos são correspondidos e como eles são classificados. O qualificador glob naplica a classificação numérica de partes inteiras em vez da ordem lexicográfica padrão, portanto, chunk9.tsé classificado antes chunk10.tsde .

    Se utilitários básicos do tipo Unix também estiverem disponíveis, você pode usar o catcomando para concatenar arquivos:

    cat *.ts(n) >final.ts
    

    Zsh está disponível através de WSL ( sudo apt-get install zsh), Cygwin e provavelmente outras distribuições de software livre para Windows.

    • 5
  3. Neil
    2021-12-27T04:18:14+08:002021-12-27T04:18:14+08:00

    O comando do Windows copyé um CMD.EXEcomando interno. Ele não faz nenhuma classificação em suas expansões curinga. Esse comportamento remonta a pelo menos o MS-DOS 6.22 COMMAND.COM(não tenho nada anterior à mão para testar). Acontece que seu sistema de arquivos NTFS armazena nomes de arquivos em uma estrutura de árvore B que tem o efeito de enumerá-los em uma ordem que se aproxima da ordem de classificação léxica.

    Mais informações estão disponíveis no blog Old New Thing:

    Por que o NTFS e o Explorer discordam na classificação de nomes de arquivos?

    Em que ordem o comando DIR organiza os arquivos se nenhuma ordem de classificação for especificada?

    • 2
  4. FeRD
    2021-12-28T04:08:02+08:002021-12-28T04:08:02+08:00

    TBH Eu acho que todas essas digressões em coisas como ordenação de bytes e etc. estão turvando as águas um pouco. Aqui está o ponto mais importante e básico que todos deveriam entender sobre ordenação em computadores:

    Por padrão (ou seja, a menos que seja aplicado um algoritmo mais avançado que faça uma interpretação mais complexa das entradas), um computador classificará dados de string (como nomes de arquivos) comparando-os caractere por caractere, começando pelo primeiro. (Que é provavelmente o mais à esquerda, embora não necessariamente porque existem linguagens RTL.)

    Isso é correto para a classificação de strings de texto, mesmo que tenham comprimentos diferentes. A maioria de nós esperaria que uma lista de nomes fosse classificada assim, por exemplo:

    • Arão
    • Alexandre
    • Ana
    • Anna bela
    • Brian

    A letra mais significativa em uma string, quando se trata de ordenação, é a primeira, e o comprimento é irrelevante, exceto que as strings com comprimento total mais curto vêm antes das mais longas que contêm o mesmo texto inicial.

    O problema é que isso é exatamente errado para números, que devem ser comparados com seus últimos dígitos alinhados. Quando estamos falando de números, o comprimento é o fator mais crítico: valores maiores são SEMPRE maiores que os menores, pois possuem dígitos mais significativos. (Suponha que estamos falando de números inteiros aqui; pontos decimais complicam ainda mais as coisas.) O fato de o comprimento ser mais significativo do que o valor é o motivo pelo qual normalmente alinhamos listas de números à direita.

    A classificação alfabética às vezes pode produzir os mesmos resultados que a classificação numérica, mas somente quando os números são representados como strings de igual comprimento. É por isso que o preenchimento com 0s corrigiu seu problema. A classificação ainda não está fazendo uma comparação numérica adequada, no entanto. (É comparar os números como strings, caractere por caractere da esquerda para a direita. Mas acontece que comparar dígito por dígito, da esquerda para a direita, é exatamente como você compararia dois números de n dígitos. O mais significativo dígito está à esquerda e o menos significativo está à direita.)

    A questão de classificação também é o motivo pelo qual tantos na indústria de computação (inclusive eu) são grandes defensores do padrão ISO-8601 para representar datas como AAAA-MM-DD. Assim como os números, as datas nesse formato serão classificadas corretamente pela classificação alfabética "burra", porque os componentes são ordenados da esquerda para a direita, do mais para o menos significativo, que é exatamente como funciona a classificação alfabética. A ordenação não está interpretando a string YYYY-MM-DD como uma data, nem está interpretando-a como um número...

    • 0
  5. Keith Miller
    2022-01-08T00:41:41+08:002022-01-08T00:41:41+08:00

    Aqui está outra abordagem do PowerShell :

    Get-ChildItem *.cs |
        Sort-Object { [Int]( $_.BaseName -replace ('\D+','') ) } |
            Get-Content |
                Add-Content ConCat.cs
    

    Alias:

    gci *.cs | Sort {[Int]($_.BaseName -replace ('\D+',''))} | gc | ac ConCat.cs
    
    • 0

relate perguntas

  • O serviço de arbitragem USB da estação de trabalho VMware não inicia automaticamente

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • atalho do shell da área de trabalho no painel lateral do explorer

  • Por que não consigo enviar arquivos do Android para o Windows 10?

  • Abrir com em vários arquivos?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve