Buscar archivos en el directorio con nombres emparejados

Buscar archivos en el directorio con nombres emparejados

Estoy ejecutando pruebas de un conjunto de pruebas de tamaño y contenido variables. Los archivos de datos se agregan y eliminan con frecuencia. Estoy buscando una forma automatizada de recopilar una lista de archivos.

Todos los archivos están en subdirectorios de D; Necesito agregar el directorio completo y el nombre a un archivo de texto. Sin embargo, sólo necesito aquellos archivos que tienen un archivo "emparejado", que tiene el mismo nombre de archivo pero una extensión diferente (entonces... nombre de archivo diferente, pero de forma estructurada). Entonces, si hay un MyFileName.Ay MyFileName.B, entonces quiero D/.../MyFileNameagregarlo a la lista de archivos.

Hay .Aarchivos sin .Barchivos, pero no hay .Barchivos sin .Aarchivos. Si a .Atiene un .Barchivo, entonces ambos archivos están en el mismo directorio.

¿Algún consejo?

Respuesta1

Si ninguno de los nombres de archivo contiene nuevas líneas, puede hacer:

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

Esto debería funcionar en el caso más general donde hay .Barchivos sin .Aarchivos.

Para manejar cualquier nombre de archivo usando herramientas GNU recientes:

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

Respuesta2

Si su afirmación es verdadera "no hay archivos .B sin archivos .A", obtenga una lista de archivos .B y elimine la extensión.

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

Respuesta3

Con zsh:

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

:relimina la extensión, por lo que si el contenido de $REPLYfue mydir/somedir/somefile.Adespués de ejecutarlo, REPLY=$REPLY:rsu contenido se convierte en mydir/somedir/somefile;
el resto es similar aesta respuesta.

información relacionada