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.A
y MyFileName.B
, entonces quiero D/.../MyFileName
agregarlo a la lista de archivos.
Hay .A
archivos sin .B
archivos, pero no hay .B
archivos sin .A
archivos. Si a .A
tiene un .B
archivo, 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 .B
archivos sin .A
archivos.
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 ]]'_)
:r
elimina la extensión, por lo que si el contenido de $REPLY
fue mydir/somedir/somefile.A
después de ejecutarlo, REPLY=$REPLY:r
su contenido se convierte en mydir/somedir/somefile
;
el resto es similar aesta respuesta.