Encontre arquivos no diretório com nomes emparelhados

Encontre arquivos no diretório com nomes emparelhados

Estou executando testes de um conjunto de testes de tamanho e conteúdo variáveis. Arquivos de dados são adicionados e removidos com frequência. Estou procurando uma maneira automatizada de reunir uma lista de arquivos.

Todos os arquivos estão em subdiretórios de D; Preciso que o diretório completo e o nome sejam adicionados a um arquivo de texto. No entanto, eu só preciso daqueles arquivos que possuem um arquivo "pareado", que tem o mesmo nome de arquivo, mas uma extensão diferente (então... nome de arquivo diferente, mas de forma estruturada). Então, se houver um MyFileName.Aand MyFileName.B, quero D/.../MyFileNameadicioná-lo à lista de arquivos.

Existem .Aarquivos sem .Barquivos, mas não existem .Barquivos sem .Aarquivos. Se a .Ativer um .Barquivo, ambos os arquivos estarão no mesmo diretório.

Algum conselho?

Responder1

Se nenhum dos nomes de arquivos contiver novas linhas, você pode fazer:

find D -type f \( -name '*.A' -o -name '*.B' \) |
  sed 's/\.[^.]*$//' |
  sort |
  uniq -d >paired_files

Isso deve funcionar no caso mais geral, onde existem .Barquivos sem .Aarquivos.

Para lidar com qualquer nome de arquivo usando ferramentas GNU recentes:

find D -type f \( -name '*.A' -o -name '*.B' \) -print0 |
  sed -z 's/\.[^.]*$//' |
  sort -z |
  uniq -dz |
  tr '\0' '\n' >paired_files

Responder2

Se sua afirmação for verdadeira “não há arquivos .B sem arquivos .A.”, obtenha uma lista de arquivos .B e remova a extensão.

find $directory-to-search -name "*.B" | sed -r -e "s~(.*)\.B~\1~g"

Responder3

Com zsh:

print -rl mydir/**/*.A(.e_'REPLY=$REPLY:r; [[ -f $REPLY.B ]]'_)

:rremove a extensão, portanto, se o conteúdo de $REPLYfoi executado mydir/somedir/somefile.Aapós a execução, REPLY=$REPLY:rseu conteúdo se torna mydir/somedir/somefile;
o resto é semelhante aesta resposta.

informação relacionada