Remoção do nível de revisão baseado em arquivos PDF duplicados no sistema de nomes de arquivos

1

Eu estou tentando criar um lote, PowerShell, ou qualquer um novato como eu poderia correr facilmente para completar a tarefa seguinte. Qualquer ajuda seria muito apreciada.

Eu tenho alguns milhares de pdfs, em uma pasta, que estou tentando classificar. O problema é que a pasta inclui revisões antigas e novas dos mesmos documentos em pdf. Eu só quero manter a revisão mais recente de cada documento único. A versão revisada é indicada pela adição de uma letra no final do nome do arquivo (A-Z). Aqui está uma lista de exemplos.

670BA-11-001.pdf
670BA-11-001A.pdf
670BA-11-001B.pdf
670BA-12-001.pdf
670BA-15-030C.pdf
670BA-49-120AC.pdf
670BA-49-120AD.pdf
  • Todos os arquivos começam com " 670BA "
  • Os números a seguir mudam. %código%
  • Um arquivo sem letra no final do nome do arquivo indica que é a revisão original
  • Um arquivo com uma letra no final do nome do arquivo indica que é uma versão revisada.
  • As revisões vão de 670BA-XX-XXX.pdf e, em seguida, A-Z e assim por diante.

Idealmente, gostaria que o arquivo em lote excluísse as versões mais antigas e deixasse a versão mais recente de cada documento exclusivo. Nesse caso, a saída deve se parecer com:

670B-11-001B.pdf
670B-12-001.pdf
670B-15-030C.pdf
670BA-49-120AD.pdf

Recebi o seguinte código, mas acredito que esteja no unix (mais uma vez perdoe minha falta de conhecimento aqui). Isso funcionaria se eu pudesse convertê-lo para o comando windows?

codes='ls | sort | cut -d'-' -f2 | uniq'
for f in $codes; do old='ls *-$f-* | head -n -1'; rm -vf $old; done

Veja o que está acontecendo;

ls | sort lists all the files in lexical order
cut -d'-' -f2 | uniq 

divide os nomes dos arquivos em '-', pega o número de 2 dígitos de meio, e se livrar de duplicatas.

ls *-$f-* | head -n -1 

lista todos os arquivos para um código de 2 dígitos, exceto o último - que é o mais novo.

rm -f $old 

apaga os arquivos antigos, e o -f evita que ele falhe na lista está vazio.

SAMPLE RUN;

/tmp# touch 601R-11-001.pdf   601R-11-001B.pdf  601R-15-030C.pdf  601R-25-005E.pdf   601R-49-120AD.pdf  601R-11-001A.pdf  601R-12-001.pdf   601R-25-005D.pdf  601R-49-120AC.pdf

/tmp# codes='ls | sort | cut -d'-' -f2 | uniq'

/tmp# echo $codes
11 12 15 25 49

/tmp# for f in $codes; do old='ls *-$f-* | head -n -1'; rm -vf $old; done

removed '601R-11-001.pdf'
removed '601R-11-001A.pdf'
removed '601R-25-005D.pdf'
removed '601R-49-120AC.pdf'
    
por Rosco 13.03.2018 / 17:29

1 resposta

1

Se você tem um código Bash (não testei o script no seu post), você pode executá-lo no Windows por instalando o Ubuntu no Windows Subsystem para Linux . Depois de configurar o Ubuntu, você pode abrir um prompt do Bash usando o item Bash no Ubuntu no Windows no menu Iniciar (se presente) ou digitando bash na caixa Executar. A estrutura C:\ do Windows está em /mnt/c/ no ambiente Bash.

Como alternativa, você pode usar o PowerShell!

$revPos = '670BA-XX-XXX'.Length
dir '670BA*.pdf' | group @{e={ $_.Name.Substring(0, $revPos) }} | % {
    $revs = $_.Group | % { $_.Name.Substring($revPos).Split('.')[0] } | group Length | sort -Descending -Property @{e={ [int]$_.Name }} | % { $_.Group | sort -Descending }
    $fileSet = $_.Name
    $revs | % { $fileSet + $_ + '.pdf' } | select -Skip 1 | del
}

Vamos dividi-lo por linha e por componente do pipeline:

  1. Por conveniência, armazene o comprimento da peça que identifica o documento, ou seja, o índice da revisão. Isso pressupõe que os identificadores de documentos são sempre do mesmo tamanho.
  2. Obtenha todos os conjuntos de arquivos.
    • Obtenha todos os arquivos no diretório atual que começam com 670BA e são .pdf s.
    • Agrupe-os pela primeira parte do nome, o identificador do documento. A empresa com o @{e={ é uma propriedade personalizada .
    • Iterar sobre os grupos.
  3. Obtenha uma lista classificada de IDs de revisão para o grupo atual.
    • A propriedade Group está nos objetos de saída do group .
    • Para cada objeto de arquivo incluído no grupo, selecione a parte de seu nome após o identificador do documento, mas antes do período em .pdf . Este é o identificador de revisão. Se um arquivo não for revisado, essa será uma cadeia de comprimento zero.
    • Agrupe os IDs de revisão por tamanho.
    • Classifique os objetos do grupo (não os itens neles) pelo comprimento de suas cadeias de membros. A propriedade Name do grupo contém o valor da propriedade que foi usada para agrupar os objetos.
    • Para cada um desses objetos de grupo, ordene seus membros em ordem alfabética. Isso agrupa todos os grupos na variável $revs , classificada de acordo com seu sistema de versão.
  4. Armazene o valor Name do grupo de arquivos em uma variável diferente para mantê-lo acessível, pois outros para-cada ( % ) irão sombrear a variável $_ .
  5. Excluir tudo, exceto a revisão mais recente no grupo de documentos.
    • Use as entradas na lista $revs .
    • Recomponha o nome completo do arquivo para cada identificador de revisão. $_ agora contém identificadores de revisão de $revs .
    • Ignore a primeira entrada, pois é a mais nova, a que queremos manter.
    • Exclua os arquivos correspondentes a todas as entradas restantes no pipeline. Se você quiser testar o script sem excluir nada , adicione um espaço e a opção -WhatIf no final dessa linha. No modo hipotético, del apenas imprimirá o que teria feito.
  6. Encerra a iteração do grupo de documentos.

Para usar o script, salve-o como um arquivo .ps1 , por exemplo %código%. Se ainda não o fez, siga as instruções na seção Habilitando Scripts do wiki de tags do PowerShell . Então você pode colocá-lo em sua pasta de documentos, abrir o PowerShell e executá-lo assim:

.\revnewest.ps1
    
por 14.03.2018 / 15:41