Descobrir se os arquivos em uma pasta existem sob outro nome em outra pasta

2

Possivelmente um pouco de inglês incorreto à frente:

Existem pelo menos 2 pastas. Para isso, A contém arquivos sem extensão, normalmente nomes de usuário, e B contém arquivos similares, com extensão '.yml' ou possivelmente sem extensão, ou até mesmo outra extensão, que não é sempre o caso.

Como descobrir se os arquivos na pasta A existem em B , possivelmente sob uma extensão diferente, sem usar linguagem de script como Python? Não seria um grande problema para mim fazer um script Python, mas para portabilidade eu prefiro scripts de shell, o que eu não gosto. Sem mencionar que não conheço todos os comandos.

Só é bom se isso puder ser feito em sistemas não-Linux também, particularmente o BSD.

EDIT 0: A diferença no nome nem sempre é apenas a extensão, o nome pode ter caracteres antes ou depois do mesmo texto. Por exemplo, se A tivesse um arquivo chamado foobar , poderia ser nomeado location_foobar em B . Caso contrário, o nome não seria mais diferente, como foo1bar , isso é algo totalmente diferente, então o script não estaria procurando por tais diferenças.

    
por rautamiekka 08.03.2014 / 00:09

1 resposta

4

É simples escrever um script de shell que faça um loop nos arquivos de um diretório e descubra se há arquivos com uma supercorda como nome em outro diretório.

#!/bin/sh
dirA=$1
dirB=$2
for x in "$dirA/"*; do
  base_name="${x##*/}"
  set -- "$dirB"/*"$base_name"*
  if [ -e "$1" ]; then
    for y; do
      echo "$base_name found in B as ${y##*/}"
    done
  else
    echo "$x not found in B"
  fi
done

Isso é portátil para qualquer shell do tipo Bourne / POSIX ( sh , ash, bash, ksh,…). Algumas construções de shell usadas:

  • #!/bin/sh : a linha shebang no topo de cada script
  • $1 , $2 : os dois argumentos para passar para o script, A e B
  • ${x##*/} é o valor de x menos o prefixo mais longo do formulário */ , ou seja, $x menos tudo até o último / , ou seja, ${x##*/} é a parte de $x após o último / .
  • set -- "B/${x##*/}."* configura os parâmetros posicionais para a lista de arquivos correspondentes em B. Se não houver correspondências, o padrão será deixado não expandido, portanto, isso definirá o primeiro parâmetro posicional como uma sequência que termina em .* .
  • for y; do faz um loop sobre os parâmetros posicionais.
por 08.03.2014 / 01:08