zsh globbing - Localiza arquivos com cadeias de nomes de arquivos duplicados

2

Eu tenho um diretório de arquivos com nomes de arquivos na forma <num1>v<num2>.txt . Eu gostaria de encontrar todos os arquivos para os quais <num1> é uma duplicata. Quando duplicatas são encontradas, devemos excluir aquelas com <num2> menores.

Isso é possível? Eu poderia facilmente escrever um script python para lidar com isso, mas pensei que poderia ser um bom aplicativo de recursos zsh integrados.

Exemplo

Na lista de arquivos a seguir, os três primeiros têm <num1> parts duplicados. Além disso, o quarto e o quinto são duplicados.

012345v1.txt
012345v2.txt
012345v3.txt
3333v4.txt
3333v7.txt
11111v11.txt

Gostaria de terminar com o diretório que contém

012345v3.txt
3333v7.txt
11111v11.txt
    
por Corey Harris 18.08.2017 / 15:20

2 respostas

4

Você pode fazer algo como:

files=(<->v<->.txt(n))
typeset -A h
for f ($files) h[${f%%v*}]=$f
keep=($h)
echo rm ${files:|keep}

(remova echo se estiver feliz)

  • <-> : qualquer sequência de dígitos ( <x-y> glob operator sem limite especificado)
  • (n) : classificação numérica
  • ${f%%v*} : padrão guloso padrão / ksh retirado do final.
  • ${files:|keep} : disjunção de matriz.
por 18.08.2017 / 18:41
0

Não estou muito familiarizado com zsh shell e estou chegando com a combinação de comandos awk abaixo com find e sort , o que torna a classificação dos arquivos encontrada primeiro com natural sort of (version) numbers within text de man sort diz.

Em seguida, passando awk com definindo -F'v' e adicionando a uma matriz baseada na primeira parte duplicada do nome do arquivo (isso garante que a última seja mantida na matriz), então o comando que estou falando seria o seguinte resulta dos arquivos com grande número v :

awk -F'v' '{U[$1]=$1"v"$2}END{for(x in U)print U[x]}' <(find . -type f|sort -V)
./012345v3.txt
./3333v7.txt
./11111v11.txt

Agora você tem a lista de arquivos que você deve manter e excluir o restante.

    
por 18.08.2017 / 17:42