Script de Shell: eliminar archivos cuando la carpeta con el mismo nombre no existe

Script de Shell: eliminar archivos cuando la carpeta con el mismo nombre no existe

Tengo un conjunto de carpetas y un conjunto de *.DATarchivos.
Quiero eliminar un *.DATarchivo si no existe ninguna carpeta con el mismo nombre (sin .DAT).
Me tomó algo de tiempo llegar a esta solución:

find . -type d > dirs.txt
for F in `find *.DAT`
do
  F=$(sed 's|\.DAT||g' <<< $F)
  if grep "$F" dirs.txt; then
    echo "$F found"
  else
    rm $F.DAT
  fi
done

Pero creo que debería haber una solución mucho más sencilla (¿una frase elegante? ¿Sin crear un archivo?...?). ¿Estoy en lo cierto?

Respuesta1

No necesita usar sedpara eliminar .DATsi está usando bash: la expansión de parámetros incorporada ${F%.DAT}logra lo mismo sin usar un subshell ni un programa externo.

Si los directorios estaban en ubicaciones arbitrarias en relación con los .DATarchivos, entonces un archivo de lista de directorios es la forma más eficiente de resolverlo, pero dado que ambos están en la misma ubicación, una respuesta mucho más sencilla es:

find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done

Tenga en cuenta que esto manejará nombres de archivos con espacios incrustados, algo que su solución no hace.

Para otros proyectiles se puede utilizar una técnica similar, pero no puedo hablar por ellos.

información relacionada