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.A
and MyFileName.B
, quero D/.../MyFileName
adicioná-lo à lista de arquivos.
Existem .A
arquivos sem .B
arquivos, mas não existem .B
arquivos sem .A
arquivos. Se a .A
tiver um .B
arquivo, 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 .B
arquivos sem .A
arquivos.
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 ]]'_)
:r
remove a extensão, portanto, se o conteúdo de $REPLY
foi executado mydir/somedir/somefile.A
após a execução, REPLY=$REPLY:r
seu conteúdo se torna mydir/somedir/somefile
;
o resto é semelhante aesta resposta.